Как Django способ сделать это? - PullRequest
1 голос
/ 23 августа 2010
class Article(models.Model):
    def user_may_see_full_version(self, user):
        # do something very sophisticated with the user
        return [True/False whatever]

Теперь я хочу создать такой шаблон:

{% for article in articles %}
    {% if article.user_may_see_full_version request.user %}{{ article }}{% else %}{{article.title }}{% endif %}
{% endfor %}

но это не работает, потому что я не могу передать аргумент методу ...

Есть ли хороший способ решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Нет способа передать аргумент методу напрямую из шаблона. Фильтр шаблонов - лучший путь:

{% if article|user_may_see_full_version:user %}{{ article }}{% else %}{{article.title }}{% endif %}

Фильтр реализован так:

@register.filter()
def user_may_see_full_version(article, user):
    return article.user_may_see_full_version(user)
1 голос
/ 23 августа 2010

Вы нарушаете философию Django, заключающуюся в отсутствии логики в шаблоне.Вы можете использовать другой язык шаблонов, например Jinja2 .Но таким образом вы потеряете некоторые классные вещи, которые предоставляют шаблоны Django.

Таким образом, ваш лучший выбор - сгенерировать эту переменную в представлении и передать ее в шаблон.Поэтому, если представление, которое отображает ваш шаблон, передает список статей, в которых у каждого есть переменная с именем user_may_see_full_version, тогда вы просто можете сделать:Шаблоны - это только способ визуализации передаваемой информации.

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