将其他数据传递给Django中的模板

时间:2012-08-26 11:54:55

标签: django django-models django-templates

每次使用Django编写代码时,我都面临同样的问题(我认为这是由于我缺乏使用此框架的经验):

我知道如何将查询集中的参数传递给模板以及如何显示它但我不知道如何在视图中添加计算参数并在模板中使用它们。

简单视图(我掌握它): 示例:检索Pizzas列表并将其显示在模板中

views.py

Pizzas = Pizza.objects.all()
return render_to_response( "pizza.html" , {'pizzas':Pizzas} )

pizza.html

{% for pizza in pizzas %}
    <li>pizza.name</li>
{% endfor %}

但是,假设我想添加一些链接到查询集的参数但是它们不像我在视图中计算的那样在数据库中,我不知道如何将此参数传递给模板以及如何使用它 - &GT; 编辑:我想在模板中按总卡路里订购我的所有披萨。

示例:对于每个比萨饼,我计算了卡路里的数量

views.py

Pizzas = Pizza.objects.all()
tab = []
for pizza in Pizzas:
    # Compute some data and return the total number of calories for one pizza
    total_number_calories = XXX
    tab.append({'p':pizza,'calories':total_number_calories'})        
return render_to_response( "pizza.html" , {'pizzas_calories':tab} )

pizza.html

?

我甚至不确定将这些额外数据传递给模板是否合适(创建表并将其作为参数传递给模板。

如果你有任何想法或最佳实践在Django中做到这一点我会接受它(很多人使用Django也会这样做!)

2 个答案:

答案 0 :(得分:0)

从您的视图到模板是一条单行道;这意味着如果没有回复您的视图请求,就无法“发回数据”。

但是,当您在模板中时,您可以轻松操作对象;这是使用custom template tags and filters

完成的

您的模板可以将从视图中获取的任何对象传递给您自己的过滤器,过滤器的结果会显示在模板中。

在您的情况下,您可以编写一个名为caloriecount的过滤器,其逻辑与您在视图中使用的逻辑相同:

@register.filter
def caloriecount(obj): # Only one argument.
    # compute calorie for pizza object
    # total_calories = 
    return total_calories

然后在你的模板中:

{% for pizza in pizzas %} 
   {{ pizza|caloriecount }}
{% endfor %}

答案 1 :(得分:0)

您应该始终尝试在视图中尽可能多地执行操作。使用您显示的代码,按总卡路里排序只是for循环后的一个额外行:

tab.sort(key=lambda t: t['calories'])