【问题标题】:Compare attributes of a Django Queryset in a template using the `in` Operator使用“in”运算符比较模板中 Django 查询集的属性
【发布时间】:2023-03-14 12:10:01
【问题描述】:

我正在尝试使用in operator 来确定当前页面上的模板变量是否也是另一个模型中的外键。

模型是这样的:

class WishlistItem(models.Model):
    user  = models.ForeignKey(User, related_name='wishlist_items')
    issue = models.ForeignKey(Issue)

在“问题”页面模板上,我正在尝试这样做:

{% if issue in user.wishlist_items %}
{% else %}
    {# A button to add the issue to the user's wishlist #}
{% endif %}

我需要做的是获取当前登录用户的wishlist_itemsQuerySet 的issue 属性,并将其与当前页面的issue 对象进行比较。我不知道如何做到这一点。我需要编写一个模板标签来执行此操作吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    我最终通过写template filter 解决了这个问题:

    @register.filter
    def in_list(obj, arg):
        "Is the issue in the list?"
        return obj in (item.issue for item in arg)
    

    然后我可以在模板中做这样的事情:

    {% if issue|in_list:user.wishlist_items.all %}
    

    我从the answer on this Stack Overflow question 得到这个想法。

    【讨论】:

      【解决方案2】:

      似乎User 和愿望清单问题之间存在某种关系,您应该在User 上以ManyToManyField 形式表达。如果您需要在WishlistItem 中记录有关关系的额外元数据,请使用through=WishlistItem

      如果User 模型来自auth 应用程序,您需要扩展User 模型以实现此目的(请参阅this blog post 以获得一些帮助)。例如:

      class MyUser(User):
          wishlist_issues = models.ManyToManyField(Issue, through=WishlistItem)
          # ...
      

      然后,在您的模板中使用:

      {% if issue not in user.wishlist_issues %}
          {# A button to add the issue to the user's wishlist #}
      {% endif %}
      

      【讨论】:

        【解决方案3】:

        wishlist_items 不是一个查询集——它是一个经理。 wishlist_items.all 是一个查询集,但显然它是 WishlistItem 对象的查询集,而不是 Issue 对象。我要做的是在视图中处理这个逻辑......类似于:

        user_has_issue = issue in (wl.issue for wl in request.user.wishlist_items.all())
        

        【讨论】:

        • 我不知道这是否是解决问题的“最佳”解决方案,但它现在对我有用,我可以理解。 :)
        【解决方案4】:

        如果我理解正确,您可以将其作为视图的参数传递,而不是为其编写模板标签。

        def myView(request):
            return render_to_response('template.html', 
                    {'query': queryToCheckIfIssueInWishList}, 
                    RequestContext(request))
        

        【讨论】:

          【解决方案5】:

          我认为您所指的内容应该进入视图,而不是模板。
          当然,您可以创建一些模板标签,但是 Django 的模板方法是尽可能保持它们的愚蠢,并将所有逻辑移动到视图中。

          另一方面,在视图中移动逻辑,然后将附加信息传递给模板应该非常简单,我肯定会采用这种解决方案。

          【讨论】:

            猜你喜欢
            • 2017-12-16
            • 1970-01-01
            • 2015-04-25
            • 1970-01-01
            • 2013-04-10
            • 2012-03-08
            • 1970-01-01
            • 2015-01-30
            • 2021-06-10
            相关资源
            最近更新 更多