2024-09-26 04:48:05 发布
网友
我需要从django模板中执行过滤查询,以便在视图中获得一组与python代码等效的对象:
queryset = Modelclass.objects.filter(somekey=foo)
在我的模板中我想做
{% for object in data.somekey_set.FILTER %}
但我似乎不知道如何编写过滤器。
我经常遇到这个问题,并且经常使用“add a method”解决方案。但是,在某些情况下,“添加一个方法”或“在视图中计算它”确实不起作用(或者不起作用)。E、 当你缓存模板片段并且需要一些非平凡的数据库计算来产生它时。除非需要,否则您不想做DB工作,但在深入了解模板逻辑之前,您不会知道是否需要。
其他一些可能的解决方案:
使用{%expr<;expression>;作为http://www.djangosnippets.org/snippets/9/中找到的<;var_name>;%}模板标记该表达式是任何合法的Python表达式,模板的上下文作为本地作用域。
更改模板处理程序。Jinja2(http://jinja.pocoo.org/2/)的语法与Django模板语言几乎相同,但具有完整的Python功能。它也更快。您可以进行批量处理,也可以将其使用限制在您正在处理的模板上,但是对于设计器维护的页面使用Django的“安全”模板。
你不能这么做,这是故意的。Django框架的作者打算将表示代码与数据逻辑严格分离。过滤模型是数据逻辑,输出HTML是表示逻辑。
所以你有几个选择。最简单的方法是进行过滤,然后将结果传递给render_to_response。或者可以在模型中编写一个方法,这样就可以说{% for object in data.filtered_set %}。最后,您可以编写自己的模板标记,尽管在这种特定情况下,我建议不要这样做。
render_to_response
{% for object in data.filtered_set %}
我只是添加了一个额外的模板标记,如下所示:
@register.filter def in_category(things, category): return things.filter(category=category)
然后我可以:
{% for category in categories %} {% for thing in things|in_category:category %} {{ thing }} {% endfor %} {% endfor %}
我经常遇到这个问题,并且经常使用“add a method”解决方案。但是,在某些情况下,“添加一个方法”或“在视图中计算它”确实不起作用(或者不起作用)。E、 当你缓存模板片段并且需要一些非平凡的数据库计算来产生它时。除非需要,否则您不想做DB工作,但在深入了解模板逻辑之前,您不会知道是否需要。
其他一些可能的解决方案:
使用{%expr<;expression>;作为http://www.djangosnippets.org/snippets/9/中找到的<;var_name>;%}模板标记该表达式是任何合法的Python表达式,模板的上下文作为本地作用域。
更改模板处理程序。Jinja2(http://jinja.pocoo.org/2/)的语法与Django模板语言几乎相同,但具有完整的Python功能。它也更快。您可以进行批量处理,也可以将其使用限制在您正在处理的模板上,但是对于设计器维护的页面使用Django的“安全”模板。
你不能这么做,这是故意的。Django框架的作者打算将表示代码与数据逻辑严格分离。过滤模型是数据逻辑,输出HTML是表示逻辑。
所以你有几个选择。最简单的方法是进行过滤,然后将结果传递给
render_to_response
。或者可以在模型中编写一个方法,这样就可以说{% for object in data.filtered_set %}
。最后,您可以编写自己的模板标记,尽管在这种特定情况下,我建议不要这样做。我只是添加了一个额外的模板标记,如下所示:
然后我可以:
相关问题 更多 >
编程相关推荐