【问题标题】:Passing additional data to a template in Django将附加数据传递给 Django 中的模板
【发布时间】:2012-08-26 11:54:54
【问题描述】:

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

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

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

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

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

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

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 的人也会这样做!)

【问题讨论】:

    标签: django django-models django-templates


    【解决方案1】:

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

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

    【讨论】:

    • 哇!!太棒了,这太完美了!它是纯蟒蛇吗?我怎样才能按降序排序(这个解决方案是递增的)?
    • 编辑:我找到了:tab.sort(key=lambda t: t['calories'], reverse= True)
    【解决方案2】:

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

    但是,当您在模板中时,您可以轻松地操作对象;这是使用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 %}
    

    【讨论】:

    • 是的,我想这样做,但我忘了提一件事:我想按总卡路里订购我的比萨饼!是否可以使用模板标签来做到这一点?如果我计算视图中的所有卡路里,并在短时间内将具有总卡路里计数的比萨饼发送到模板,您认为有可能吗?
    • 您应该在视图中进行排序,这些小细节应该成为您问题的一部分。
    猜你喜欢
    • 2011-07-03
    • 2015-10-27
    • 2014-03-31
    • 2017-12-31
    • 2012-10-09
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多