2012-07-04 6 views
2

Как я могу запросить многотоварное поле в шаблоне Django?Django query manytomanyfield в шаблоне

Например, это, если оператор не работает (я знаю, что я не могу вызывать функции с аргументами в шаблонах 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

Это не работает, потому что вы, кажется, писать код питона в шаблоне ... вы должны либо запустить цикл с вашей точки зрения и передать список сообщенийи их информацию в шаблон, или написать фильтр шаблонов, который определяет, нравится ли определенному пользователю сообщение. Например:

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) вместо этого of 'bool (post.likes.filter (user = user))' в наборе запросов. Это немного быстрее, и это похоже на то, для чего оно предназначено. Он будет использоваться так: 'return post.likes.filter (user = user) .exists()' – almostflan

Смежные вопросы