首页 > 解决方案 > 显示在 Django 模型中创建的项目总数

问题描述

我的 Django 项目包含一个带有项目和任务的任务管理器,我有一个通用列表页面,显示所有项目的列表及其总任务的信息:

class IndexView(generic.ListView):
    template_name = 'projects/index.html'
    context_object_name = 'project_list'

    def get_queryset(self):
        """Return 10 projects."""
        return Project.objects.order_by('is_complete')[:10]

我想在我的列表页面上显示添加的项目和任务的总数,但我不确定我应该如何去做。我目前的所有工作都是列出每个项目中包含的任务数量,但现在我想要一个总数 - 我应该将其添加为新视图吗?例如,我尝试将其添加到上面的视图中:

def total_projects(self):
    return Project.objects.count()

然后调用{{ project_list.total_projects }}我的模板,但它没有返回任何内容。

视图是执行此操作的正确位置吗?

标签: django

解决方案


目前的所有工作都是列出每个项目中包含的任务数量,但现在我想要一个总数 - 我应该将其添加为新视图吗?

这取决于。如果您只想显示数据库中前 10 个已完成项目的项目和任务总数(这是您的get_queryset方法所做的,要小心),我会在同一个视图中完成所有这些(它会是仅仅为了显示一些数字而创建一个新视图是没有用的,这不是ListViewIMO 的目的)。

另一方面,您正在total_projects从模型的实例调用类的实例方法 ( )。该方法在模型上不存在,并且当在模板中调用对象中不存在属性/方法时,您将一无所获。基于上一段,我将使用get_context_data在视图的上下文中设置它:

def get_context_data(self, **kwargs):
    data = super().get_context_data(**kwargs)
    data["total_projects"] = Projects.objects.count()
    # I'm assuming you only need the whole number of tasks with no separation
    data["total_tasks"] = Task.objects.count()

    return data

最后,您可以编辑您的get_queryset方法并使其成为实例属性(如果您希望它更干净,并且无需额外代码即可处理过滤):

class IndexView(generic.ListView):
    queryset = Project.objects.order_by('is_complete')[:10]

推荐阅读