首页 > 解决方案 > Django - 基于类的视图问题如何在同一模板中结合 DetailView 和 ListView

问题描述

谁能告诉我如何将详细视图与列表视图结合并在同一模板中显示信息,我会向您解释,我正在学习 Django,我正在尝试创建一个问答网络应用程序,我需要用它所有的 awnsers,我需要在我的详细视图中显示一个特定的问题,显示在它的所有 awsers 下方,比如 stackoverflow

#models.py
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User


# Create your models here.
class Question(models.Model):

    # user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="question", null=True)
    name = models.CharField(max_length=100)
    description = models.TextField(max_length=100)
    date = models.DateTimeField(auto_now_add=True)
    cant_resp = models.IntegerField(default=0)
    question_type = models.CharField(max_length=50, choices=QUESTION_TYPES_CHOICES)

    def __str__(self):
        return self.description




class Anwser(models.Model):

    # user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="anwser", null=True)
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    text = models.TextField(max_length=400)
    date= models.DateTimeField(auto_now_add=True)


#and this are my views.py
from django.shortcuts import render, redirect
from django.urls import reverse, reverse_lazy
from django.contrib.auth.mixins import  LoginRequiredMixin
from django.views import generic

from .forms import QuestionForm, AnwserForm
from .models import Question

# Create your views here.

class QuestionListView(LoginRequiredMixin, generic.ListView):
    template_name = 'anwserquestions/question_list.html'
    context_object_name = 'questions'

    def get_queryset(self):

        return Question.objects.all()

def createquestion(response):
    if response.method == "POST":
        print("Its POST method")
        form = QuestionForm(response.POST)
        # user =response.user
        if form.is_valid():
            name = form.cleaned_data["name"]
            description=form.cleaned_data['description'],
            question_type=form.cleaned_data['question_type'],
            # date=form.cleaned_data['date'],
            t = Question(name=name, description=description, question_type=question_type, cant_resp=0)
            t.save()
            response.user.question.add(t)  # adds the to do list to the current logged in user

            # return HttpResponseRedirect("/%i" %t.id)
            return redirect('anwserquestions:question-list')

    else:
        form = QuestionForm()

    return render(response, "anwserquestions/question_create.html", {"form":form})

    
class QuestionDetailView(LoginRequiredMixin, generic.DetailView):
    model = Question
    template_name = 'anwserquestions/question_detail.html'
    context_object_name = 'question'

    def get_queryset(self):
        return Question.objects.all()


class QuestionDeleteView(LoginRequiredMixin, generic.DeleteView):
    template_name = 'anwserquestions/question_delete.html'
    context_object_name = 'question'
    success_url = reverse_lazy('anwserquestions:question-delete')

    # def get_queryset(self):

    #     return Question.objects.all()


标签: djangodjango-viewsdjango-class-based-views

解决方案


您可以answers通过将其包含在视图上下文中来获取相关信息,这样您QuestionDetailView就变成了

class QuestionDetailView(LoginRequiredMixin, generic.DetailView):
    model = Question
    template_name = 'anwserquestions/question_detail.html'
    context_object_name = 'question'

    def get_context_data(self, **kwargs):
        context = super(QuestionDetailView, self).get_context_data(**kwargs)
        context['answers'] = Answer.objects.filter(post=self.get_object())
        return context

推荐阅读