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 %}
但这不起作用,因为我无法将参数传递给方法......
有什么好方法可以解决这个问题吗?
答案 0 :(得分:2)
无法直接从模板向方法传递参数。模板过滤器是最好的方法:
{% 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 :(得分:1)
你正在打破Django在模板中没有逻辑的哲学。您可以使用其他模板语言,例如Jinja2。但是这样你就会失去Django模板提供的一些很酷的东西。
因此,您最好的选择是在视图中生成该变量并将其传递给模板。因此,如果呈现模板的视图传递了一个文章列表,其中每个人都有一个名为user_may_see_full_version的变量,那么您就可以这样做:
{% if article.user_may_see_full_version %} whatever
专注于处理视图中的逻辑。模板只是呈现传递信息的一种方式。