Как запретить 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 %}
Вернуться на верх