Django的做法是什么?

时间:2010-08-22 22:00:09

标签: python django

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 个答案:

答案 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

专注于处理视图中的逻辑。模板只是呈现传递信息的一种方式。