如何在Django模板中查询manytomanyfield?
例如,这个if语句不起作用(我知道我不能在Django模板中调用带有参数的函数),但是这显示了我想要做的事情:
template.html
{% for post in posts %}
{% if post.likes.filter(user=user) %}
You like this post
{% else %}
<a>Click here to like this post</a>
{% endif %}
{% endfor %}
models.py
class User(Model):
# fields
class Post(Model):
likes = ManyToManyField(User)
答案 0 :(得分:3)
它不起作用,因为您似乎在模板中编写python代码...您需要在视图中运行循环并将帖子及其信息列表传递给模板,或者编写模板过滤器确定某个用户是否喜欢帖子。例如:
from django import template
register = template.Library()
@register.filter
def is_liked_by(post, user):
return bool(post.likes.filter(user=user))
然后在你的模板中:
{% for post in posts %}
{% if post|is_liked_by:request.user %}
You like this post
{% else %}
<a>Click here to like this post</a>
{% endif %}
{% endfor %}
答案 1 :(得分:3)
为了满足您的需求,您可以执行以下操作:
{% for post in posts %}
{% if user in post.likes.distinct %}
You like this post
{% else %}
<a>Click here to like this post</a>
{% endif %}
{% endfor %}
或者,您可以使用Greg的方法。他的答案的优点是,当你进入非常大的数据集时它会更好地扩展。此方法不需要您编写任何自定义过滤器。