Передача объекта в пользовательский фильтр 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 допускает плохое разграничение с фильтрами шаблонов.
У вас есть шаблон и функция рендеринга. У вас есть контекст. Вы можете отправить в контекст уже результат moderated_object.approved_value(fieldname).

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

шаблон

{{ moderated_object }}

два }}, а не три }}}

Вы можете сказать мне: я создаю цикл с некоторыми дополнительными элементами в шаблоне.

ответ - дополнительная логика в шаблоне это плохо, но, если хотите - можете создать генератор до:

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

все возможно. Попробуйте думать полностью без шаблонного фильтра. И вы найдете лучший способ, я уверен.

Вернуться на верх