Передача объекта в пользовательский фильтр 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 %}
все возможно. Попробуйте думать полностью без шаблонного фильтра. И вы найдете лучший способ, я уверен.