Как запретить Django оценивать ложные условия шаблона?
У меня есть шаблон Django, который отображает ссылки, определенные конкретными приложениями, например:
<div>{% url 'admin:myapp_myview' %}</div>
Однако я хочу сделать это приложение необязательным в моем коде, поэтому я создал простой тег, названный is_installed, например:
import logging
from django.apps import apps
logger = logging.getLogger(__name__)
@register.simple_tag
def is_installed(name):
result = apps.is_installed(name)
logger.info('App "%s" is installed? %s', name, result)
return result
и использовать это, чтобы обернуть мою ссылку в оператор if, например:
{% load mytags %}
{% is_installed "myapp" as is_myapp_installed %}
{% if is_myapp_installed %}
<div>{% url 'admin:myapp_myview' %}</div>
{% endif %}
К сожалению, похоже, что независимо от значения is_myapp_installed, шаблонизатор Django оценивает все части шаблона, даже если эти части обернуты в операторы if с ложными условиями.
Это означает, что когда я отключаю myapp из списка INSTALLED_APPS, я вижу вывод журнала:
App "myapp" is installed? False
Однако Django выдает мне ошибку шаблона:
Reverse for 'myapp_myview' not found. 'myapp_myview' is not a valid view function or pattern name.
Подразумевает, что он игнорирует оператор if.
Есть ли способ исправить это и остановить Django от оценки кода внутри ложных операторов if?
Есть ли альтернативные решения?
Вам нужен тег шаблона with вот такой:
{% with "myapp" as myapp %}
{% if myapp|is_installed %}
<div>{% url 'admin:myapp_myview' %}</div>
{% endif %}
{% endwith %}