2012-07-04 101 views
2

如何查詢Django模板中的manytomanyfield?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

標準Django模板系統不允許調用帶參數的方法。如果你想調用上面的代碼,你可以使用Jinja2。 – szaman

回答

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

或者,你可以使用格雷格的方法。他的答案的優點是,當你進入非常大的數據集時,它的規模會更好。這種方法不需要你編寫任何自定義過濾器。

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

您可能需要考慮使用['.exists()'](https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.exists) 'bool(post.likes.filter(user = user))'在查詢集上。它稍微快一點,這看起來就像是它的設計。它會像這樣使用:'return post.likes.filter(user = user).exists()' – almostflan