什么是Django的方式来做到这一点?

什么是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 %} 

但是,这并不工作,因为我不能将参数传递给方法...

有什么好看解决这个问题的方法?

+1

,寻找在Django文档。 – 2010-08-22 22:01:39

+0

显示'非常复杂'的部分可能会有所帮助,可能这可以通过在视图和/或模型中使用好的查询集来解决,而不必回退到丑陋的模板逻辑。 – KillianDS 2010-08-23 10:38:43

无法将参数直接从模板传递给方法。模板过滤器是最好的一段路要走:

{% 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 

关注您的视图处理逻辑。模板只是一种呈现信息的方式。

+0

但这需要迭代queryset两次 - 不是很好;-) – Alex 2010-08-24 17:00:54

+0

取决于你如何实现,你不必。另一方面,使用过滤器标签需要调用一个函数,每次调用另一个函数,创建内存上下文并且可能每次都敲击数据库。 Django的做事方式是不在模板内传递参数。 – maraujop 2010-08-27 14:13:34