Возможно ли, чтобы шаблон Django проверил наличие строки в таблице без написания пользовательского тега / фильтра? - PullRequest
3 голосов
/ 31 августа 2010

У меня есть следующие модели:

class Post(models.Model):
    message = models.TextField()
    (etc.)

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    (etc.)

class PostFollow(models.Model):
    post = models.ForeignKey(Post, related_name='follower_set')
    follower = models.ForeignKey(UserProfile, related_name='follower_set')
    creation_date = models.DateTimeField(auto_now_add=True)
    an_arbitrary_score = models.IntegerField(default=0)
    (etc.)

    class Meta:
        unique_together = ('post', 'follower',)

В моем шаблоне я хотел бы отобразить список сообщений вместе со ссылкой "следовать" или "отписаться", чтобы текущий пользователь мог принять решениеследовать ли данному посту.В мире, где я мог бы использовать аргументы в шаблонизации Django, я бы сделал что-то вроде этого:

{% for post in post_set %}
    <...stuff...>
    {% if post.user_is_following user %}unfollow{% else %}follow{% endif %}
    <...more stuff...>
{% endfor %}

Однако я не могу этого сделать.И я не могу создать метод с нулевым аргументом, вызываемый шаблоном, ни в одной из этих моделей, потому что им всем нужно знать хотя бы один другой аргумент, чтобы ответить на вопрос, существует ли данная строка PostFollow в этой таблице.

Я рад написать шаблонное расширение, но перед тем, как вывести большие пушки, подходит ли это для этого?Или есть более Djangoesque решение?

1 Ответ

5 голосов
/ 31 августа 2010

Шаблонные фильтры не большие пушки:

# your_app/templatetags/following.py 

from django import template
register = template.Library()

@register.filter
def is_followed_by(post, user):
   return post.is_followed_by(user)  

и затем:

{% load following %}
...
{% if post|is_followed_by:user %} ... {% endif %}

Вы также можете поместить всю логику в шаблонный фильтр, удалить метод 'post.is_followed_by' и использовать фильтр вместо метода модели, как любую другую функцию, декоратор @ register.filter не вредит декорированной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...