如何在Django模板中执行查询筛选

2024-09-26 04:48:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从django模板中执行过滤查询,以便在视图中获得一组与python代码等效的对象:

queryset = Modelclass.objects.filter(somekey=foo)

在我的模板中我想做

{% for object in data.somekey_set.FILTER %}

但我似乎不知道如何编写过滤器。


Tags: 对象django代码in视图模板fordata
3条回答

我经常遇到这个问题,并且经常使用“add a method”解决方案。但是,在某些情况下,“添加一个方法”或“在视图中计算它”确实不起作用(或者不起作用)。E、 当你缓存模板片段并且需要一些非平凡的数据库计算来产生它时。除非需要,否则您不想做DB工作,但在深入了解模板逻辑之前,您不会知道是否需要。

其他一些可能的解决方案:

  1. 使用{%expr<;expression>;作为http://www.djangosnippets.org/snippets/9/中找到的<;var_name>;%}模板标记该表达式是任何合法的Python表达式,模板的上下文作为本地作用域。

  2. 更改模板处理程序。Jinja2(http://jinja.pocoo.org/2/)的语法与Django模板语言几乎相同,但具有完整的Python功能。它也更快。您可以进行批量处理,也可以将其使用限制在您正在处理的模板上,但是对于设计器维护的页面使用Django的“安全”模板。

你不能这么做,这是故意的。Django框架的作者打算将表示代码与数据逻辑严格分离。过滤模型是数据逻辑,输出HTML是表示逻辑。

所以你有几个选择。最简单的方法是进行过滤,然后将结果传递给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 %}

相关问题 更多 >