将对象传递给Django自定义筛选器



我正在使用Django 3.2

我正在编写一个审核应用程序,我希望能够在我的模板中只显示批准的值。

我想能够使用这样的新过滤器:

{{ moderated_object.field_name | approved }}

这就是我目前所拥有的:

from django import template
register = template.Library()

@register.filter(name='approved')
def moderator_approved_field_value(moderated_object, fieldname):
return moderated_object.approved_value(fieldname)

正如我在上面写的过滤器,我只能这样使用:

{{ moderated_object| approved: fieldname }}

这太难看了。有没有一种方法可以在后台将对象传递给函数,这样我就可以使用更干净的方法来使用模板中的过滤器?

我认为django允许使用模板过滤器进行糟糕的设计
您有一个模板和渲染功能。你有背景。您可以在上下文中发送已调节对象的结果。已批准值(字段名(。

def get_context(...):
...
context[moderated_object] = moderated_object.approved_value(fieldname)
...

模板

{{ moderated_object }}

两个}},而不是三个}}}

你可以告诉我:我在template中创建了一个带有一些附加元素的循环。

答案-模板中的附加逻辑不好,但是,如果你想的话,你可以在之前创建一个生成器

def get_context(...):
...
context[moderated_objects] = ((obj, obj.approved_value(fieldname)) for obj in context[moderated_objects])
...

模板

{% for obj, approvement in moderated_objects %}
{{ approvement }} 
{{ moderated_object }}
{% endfor %}

一切皆有可能。试着在没有模板过滤器的情况下完全思考。你找到了最好的方法,我是舒尔。

最新更新