Django的ListView-如何自定义它

时间:2019-03-06 22:08:53

标签: python django django-models django-views django-generic-views

很抱歉,如果这是重复的,但是我没有找到问题的答案。

我的下面的问题

在使用ListView时,我真的很难理解如何自定义视图。我阅读了Django文档,但我觉得它很简短。

我想做的是计算每个主题的问题,并返回问题最多的主题。我可以在models.py(主题类)中使用以下代码来计算每个主题的问题数量:

def questions_count(self):
    return Question.objects.filter(question__topic = self).count()

但是,我只想返回最受欢迎的主题和问题数量。

使用基于函数的视图,我将遍历主题,并创建两个存储主题名称和问题数量的变量。但是,对于ListView,我不知道是否要使用get_context_data(),get_queryset()或其他方式。

我的视图类

class TopicsView(ListView):
    model = Topic
    context_object_name = 'topics'
    template_name = 'home.html'

我的模型

class Topic(models.Model):
    name = models.CharField(max_length=30, unique=True)
    description = models.CharField(max_length=100)

class Question(models.Model):
    ....
    topic = models.ForeignKey(Topic, related_name='questions', on_delete=models.CASCADE)    
    ....

2 个答案:

答案 0 :(得分:1)

您可能想尝试使用default_scope来获取与每个.annotate()关联的Questions的数量:

Topic

每个from django.db.models import Count topics_count = Topics.objects.annotate(count_of_questions=Count('question')) 对象将具有一个新属性Topic,该属性是与每个count_of_questions相关的问题总数。

在您的Topic中:

ListView

然后,您应该可以使用dictsortreversed在模板中执行以下操作,应该应返回的问题最多的主题:

class TopicsView(ListView):
    model = Topic
    context_object_name = 'topics'
    template_name = 'home.html'

    def get_queryset(self):
        queryset = super(TopicsView, self).get_queryset()
        queryset = queryset.annotate(count_of_questions=Count('question'))

以下SO Q&A

中也有类似的问答

答案 1 :(得分:0)

最后,我设法通过get_context_data()函数做到了这一点。这是我的解决方案的样子:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)

    mostQuestions = context['object_list'][0].questions_count()
    mostQuestionsTopic = context['object_list'][0]

    for topic in context['object_list']:
        if topic.questions_count() > mostQuestions:
            mostQuestions = topic.questions_count()
            mostQuestionsTopic = topic

    context['mostQuestions'] = mostQuestions
    context['mostQuestionsTopic'] = mostQuestionsTopic

    return context

有没有更有效的解决方案?