0

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

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

简单视图(我掌握): 示例:检索比萨饼列表并在模板中显示它们

视图.py

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

比萨饼.html

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

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

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

视图.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} )

比萨饼.html

?

我什至不确定将这些附加数据传递给模板的方法是否良好(创建一个表并将其作为参数传递给模板。

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

4

2 回答 2

0

You should always try and do as much as possible in the view. With the code you've shown, ordering by total calories is just one extra line after the for loop:

tab.sort(key=lambda t: t['calories'])
于 2012-08-26T12:30:20.007 回答
0

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

但是,当您在模板中时,您可以轻松地操作对象;这是使用自定义模板标签和过滤器完成的

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

在您的情况下,您可以编写一个名为 的过滤器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 %}
于 2012-08-26T12:02:46.873 回答