在模板中使用`in`运算符比较Django Queryset的属性

1 投票
5 回答
1125 浏览
提问于 2025-04-15 17:33

我正在尝试使用in运算符来判断当前页面的一个模板变量是否也是另一个模型中的外键。

这个模型大概是这样的:

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 %}

我需要获取当前登录用户的查询集中的issue属性,并将其与当前页面的issue对象进行比较。我不知道该怎么做。是不是需要写一个模板标签来实现这个功能?

5 个回答

0

如果我理解得没错的话,你可以直接把这个作为视图的一个参数传递,而不是为它写一个模板标签。

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

看起来,User(用户)和愿望清单之间有一种关系,你应该在User上用ManyToManyField来表示这种关系。如果你需要记录关于这种关系的额外信息,可以使用through=WishlistItem

如果User模型是来自auth应用的,你需要扩展这个User模型来实现这个功能(可以参考这篇博客来获取一些帮助)。例如:

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 %}
2

我最后通过写一个模板过滤器解决了这个问题:

@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 %}

这个想法是从这个Stack Overflow问题的回答中得到的。

撰写回答