【问题标题】:Django object not countDjango 对象不计数
【发布时间】:2019-09-12 12:55:45
【问题描述】:

当用户添加项目时,项目数应显示在仪表板中,但我的代码不计算在内,但它仅在此处显示我迄今为止尝试过的内容为零。

views.py

class ItemListView(LoginRequiredMixin, ListView):
    model = Item
    template_name = 'item/items.html'
    context_object_name = 'items'
    ordering = ['-created_at', '-updated_at']

    def get_queryset(self):
        return super(ItemListView, self).get_queryset().filter(author=self.request.user)

class ItemCountView(LoginRequiredMixin, ListView):
    model = Item
    template_name = 'dashboard/dash.html'
    context_object_name = 'items'

    def get_queryset(self):
        return Item.objects.filter(author=self.request.user)

在模板 dash.html 中

当它是{{ items.count }} 时它不计数,但如果{{ items|length }} 它显示为零。请告诉我我在哪里犯错。

【问题讨论】:

    标签: django python-3.x django-models django-templates


    【解决方案1】:

    在查询集中使用count()

    def get_queryset(self):
        return Item.objects.filter(author=self.request.user).count()
    

    然后在模板中使用{{ items }}

    更新:

    class ItemListView(LoginRequiredMixin, View):
        template_name = 'item/items.html'
        login_url = 'accounts/login/'
    
        def get(self, request, *args, **kwargs):
            total_item = Item.objects.filter(author=self.request.user).count()
            context = {'total_item': total_item}
            return render(request, self.template_name, context)
    

    在模板中使用{{ total_item }}

    更新 2:

    class ItemCountView(LoginRequiredMixin, ListView):
        model = Item
        template_name = 'dashboard/dash.html'
        context_object_name = 'items'
    
        def get_queryset(self):
            return Item.objects.all().values('item_name').annotate(total=Count('item_name'))
    

    然后在模板中使用

    {% for item in items %}
        {{ item.item_name }} {{ item.total }}
    {% endfor %}
    

    【讨论】:

    • 哇,太棒了!! @shafik 很抱歉,我让你打扰了一段时间,它终于可以工作了,但我想知道如果我想向仪表板添加其他功能,项目计数只是仪表板的一个功能,我应该向仪表板添加更多网址吗?跨度>
    • 没有。您可以使用get_context_data。研究这个docs.djangoproject.com/en/dev/topics/class-based-views/…。这可能会对您有所帮助。另一个网址不能解决您的问题
    【解决方案2】:

    您可以在 Item 模型中定义属性:

    class Item(models.Model):
    
        title = models.CharField(max_length=100)
    
        @property
        def count(self):
            self.__class__.objects.filter(author=self.request.user).count()
    

    无需更改模板。也不再需要视图中的查询集

    【讨论】:

    • 您已经在模板中调用了 {{ items.count }}。我的这个案例的版本。当 {{ items.count }} 出现在模板中时,@property 将被调用
    • 即使__class__?你将它添加到 model 中?
    猜你喜欢
    • 1970-01-01
    • 2020-03-23
    • 2020-04-22
    • 1970-01-01
    • 2013-10-17
    • 2011-06-20
    • 2020-04-25
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多