在Django模板中处理依赖对象

时间:2016-10-10 17:30:29

标签: django python-3.x

首先,我是否理解Django标签实际上是一种迷你语言,并且Python不会在其中运行?

如果是这样,我该如何处理视图难以预处理的值?例如,这就是我想要做的事情(用户有很多评级):

{% for user in users %} # Where users are defined in the view/context
  ...
{% endfor %}

然后在里面,我尝试了几件事

  {% for rating in user.ratings %}

  {% for rating in Rating.objects.filter(user=user) %}

前者永远不会迭代。后者是可怕的,无论如何都不起作用 - 它引发了TemplateSyntaxError at / Could not parse the remainder

但由于它只是在用户循环的中间,我让相关用户进行过滤,我不确定如何在视图中设置第二个QuerySet。

这里最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

你是对的,你不能在模板中运行任意Python:语法由模板系统定义,默认情况下为Django template language (DTL)

在您的特定情况下,有一种简单的方法可以访问模型对象的外键关系:使用_set关键字。以下应该有效:

{% for rating in user.rating_set.all %}
<!-- do stuff with rating -->
{% endfor %}

通过仅搜索item.ratings,期望ratings成为模型字段。您需要指定_set以指示它查看外键模型。

这种情况很简单:在其他情况下,最好的选择是在视图中运行逻辑并将变量传递给模板的上下文或(非平凡)来制作自己的自定义模板标记。

答案 1 :(得分:0)

您需要使用_set.all

{% for user in users %} # Where users are defined in the view/context
    {% for rating in user.rating_set.all %}
        ...
    {% endfor %}
{% endfor %}

如果您必须过滤see this