Я пытаюсь использовать тег шаблона, описанный в ответе SO: https://stackoverflow.com/a/6217194/493211 в проект с использованием Django 1.4.3 (с Python 2.7.2).

Я адаптировал это так:

from django import template


register = template.Library()

@register.filter
def template_exists(template_name):
    try:
        template.loader.get_template(template_name)
        return True
    except template.TemplateDoesNotExist:
        return False

Чтобы я мог использовать это в другом шаблоне:

{% if 'profile/header.html'|template_exists %}        
  {% include 'profile/header.html' %}
{% else %}
  {% include 'common/header.html' %}
{% endif %}

Таким образом, я мог бы избежать использования таких решений, как изменение порядка своих приложений в INSTALLED_APPS.

Однако это не работает. Если шаблон не существует, то исключение возникает в стеке / консоли, но не распространяется до get_template(..) (внутри этого Statement) и, следовательно, не для моего глупого API . Следовательно, это взрывается в моем лице во время рендеринга. Я загрузил трассировку стека в pastebin

Это разыскиваемое поведение от Джанго?

Я закончил тем, что прекратил делать глупости как есть. Но мой вопрос останется.

6
Marc-Olivier Titeux 23 Янв 2013 в 17:43

2 ответа

Лучший ответ

А как насчет пользовательского тега? Это не обеспечивает полную функциональность include, но, кажется, отвечает потребностям в вопросе .:

@register.simple_tag(takes_context=True)
def include_fallback(context, *template_choices):
    t = django.template.loader.select_template(template_choices)
    return t.render(context)

Тогда в вашем шаблоне:

{% include_fallback "profile/header.html" "common/header.html" %}
2
Geoffrey Hing 7 Фев 2013 в 15:10

Я нашел какой-то ответ на свой вопрос, поэтому выкладываю его здесь для дальнейшего рассмотрения.

Если я использую мой фильтр template_exists, как это

{% if 'profile/header.html'|template_exists %}        
  {% include 'profile/header.html' %}
{% else %}
  {% include 'common/header.html' %}
{% endif %}

И если profile/header.html не существует, то TemplateDoesNotExist странным образом распространяется при загрузке страницы, и я получаю ошибку сервера. Однако, если вместо этого я использую это в моем шаблоне:

{% with 'profile/header.html' as var_templ %}
  {% if var_templ|template_exists %}
    {% include var_templ %}
  {% else %}
    {% include 'common/header.html' %}
  {% endif %}
{% endwith %}

Тогда это работает как шарм!

Очевидно, я мог бы использовать

django.template.loader.select_template(['profile/header.html','common/header.html']) 

В виде (из этого SO ответа). Но я использую CBV, который я хотел сохранить довольно общим, и это было вызвано из основного шаблона. А также я подумал, что было бы неплохо, чтобы мой сайт работал, если по каким-либо причинам это приложение не работает. Если это кажется вам глупым, пожалуйста, оставьте комментарий (или еще лучший ответ).

1
Community 23 Май 2017 в 11:45