Django在模板中查询manytomanyfield

时间:2012-07-04 00:52:23

标签: python django django-templates

如何在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)

2 个答案:

答案 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的方法。他的答案的优点是,当你进入非常大的数据集时它会更好地扩展。此方法不需要您编写任何自定义过滤器。