什么是Django的方式来做到这一点?
问题描述:
class Article(models.Model):
def user_may_see_full_version(self, user):
# do something very sophisticated with the user
return [True/False whatever]
现在我想创建这样一个模板:什么是Django的方式来做到这一点?
{% for article in articles %}
{% if article.user_may_see_full_version request.user %}{{ article }}{% else %}{{article.title }}{% endif %}
{% endfor %}
但是,这并不工作,因为我不能将参数传递给方法...
有什么好看解决这个问题的方法?
答
无法将参数直接从模板传递给方法。模板过滤器是最好的一段路要走:
{% if article|user_may_see_full_version:user %}{{ article }}{% else %}{{article.title }}{% endif %}
该过滤器是这样实现的:你想一个templatetag
@register.filter()
def user_may_see_full_version(article, user):
return article.user_may_see_full_version(user)
答
你打破了Django的模板中没有逻辑的哲学。您可以使用其他模板语言,如Jinja2。但这样你就会失去Django模板提供的一些很酷的东西。
因此,您最好的选择是在视图中生成该变量并将其传递给模板。因此,如果呈现模板的视图通过的文章列表,其中每个人都有一个变量,名为user_may_see_full_version那么你根本就做:
{% if article.user_may_see_full_version %} whatever
关注您的视图处理逻辑。模板只是一种呈现信息的方式。
,寻找在Django文档。 – 2010-08-22 22:01:39
显示'非常复杂'的部分可能会有所帮助,可能这可以通过在视图和/或模型中使用好的查询集来解决,而不必回退到丑陋的模板逻辑。 – KillianDS 2010-08-23 10:38:43