2016-10-07 1 views
0

i sind mit django 1,9, und ich habe diese zwei einfachen Modelle:django Seiten und der Zugriff auf übergeordnetes Objekt

#models.py 
class Question(models.Model): 
    question_title = models.CharField(max_length=50) 
    question_text = models.CharField(max_length=500) 
class Answer(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 
    answer_text = models.CharField(max_length=500) 

und diese Ansicht nur für die Antworten:

# views.py 
class QuestionView(generic.DetailView): 
    model = Question 
    template_name = 'forum/question.html' 

aber jetzt will ich zu bauen Seiten in die Ansichten:

# models.py updated 
class QuestionView(generic.ListView): 
    model = Question 
    template_name = 'forum/question.html' 
    paginate_by = 10 
    def get_queryset(self): 
     return Question.objects.get(id=self.kwargs['pk']).answer_set.all() 

aber dies führt zu einem Problem, habe ich keinen Zugriff mehr auf die Frage Objekt in der t emplate:

#template.html 
{{ question.question_title }} 

Wie kann ich beide Seiten und Zugriff auf das Frageobjekt haben? Oder will ich jetzt etwas, was einfach unmöglich ist?

ps. Ich importiere alles, was ich brauche (generische und mehr), ich habe sie einfach aus Gründen der Lesbarkeit weggelassen.

Antwort

1

Sie können beliebige Daten zu einer Ansicht hinzufügen, indem Sie get_context_data() definieren.

def get_context_data(self, *args, **kwargs): 
    context = super(ListView, self).get_context_data(*args, **kwargs): 
    context['question'] = Question.objects.get(pk=self.kwargs['pk']) 
    return context 

Alternativ können Sie reflektieren, dass Ihre ursprüngliche Detailview bereits ermöglicht Ihnen den Zugriff sowohl auf die Frage - über das Standard-Objekt - und seine Antworten - über {{ object.answer_set.all }} in der Vorlage, ohne etwas anderes zu tun. Es scheint unwahrscheinlich, dass eine Frage genügend Antworten auf die Paginierung hat, was der Hauptvorteil ist, den Ihnen das ListView bietet.

+0

Vielen Dank, genau das, was ich brauche. Danke für die Antwort – stetim94

Verwandte Themen