6

SO answer: 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(..)(このステートメント内から) に伝播されないため、愚かなAPI には伝播されません。したがって、これはレンダリング中に私の顔に爆発します。スタックトレースをペーストビンにアップロードしました

これは Django の望ましい動作ですか?

このままバカなことをするのはやめました。しかし、私の疑問は残ります。

4

2 に答える 2

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" %}
于 2013-02-06T21:57:59.627 に答える
1

私の質問に対するある種の答えを見つけたので、今後の参考のためにここに投稿します。

このように 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 を使用しており、これはメイン テンプレートから呼び出されました。また、このアプリがなんらかの理由でダウンした場合でも、自分のサイトが機能するのはいいことだと思いました。これがばかげていると思われる場合は、コメントを残してください (またはさらに良い回答)。

于 2013-02-06T15:31:55.880 に答える