检查Django模板中是否存在模板

pq.*_*pq. 12 django templates exists try-catch

在将模板包含在Django模板中之前是否存在开箱即用的检查模板是否存在的方法?也欢迎替代品,但由于特殊情况,其中一些不起作用.

例如,这是一个稍微不同的问题的答案.这不是我要找的: 如何检查Django中是否存在模板?

Chr*_*att 15

include如果你传递一个错误的模板参考,假设不会爆炸,这可能是最好的方法.您的另一种选择是创建一个模板标记,它基本上对您提到的链接进行检查.

非常基本的实施:

from django import template

register = template.Library()

@register.simple_tag
def template_exists(template_name):
    try:
        django.template.loader.get_template(template_name)
        return "Template exists"
    except template.TemplateDoesNotExist:
        return "Template doesn't exist"
Run Code Online (Sandbox Code Playgroud)

在您的模板中:

{% template_exists 'someapp/sometemplate.html' %}
Run Code Online (Sandbox Code Playgroud)

那个标签实际上并不是那么有用,所以你可能想要创建一个实际上向上下文添加变量的标签,然后你可以在if语句中检查或不检查.


kib*_*ibu 10

我遇到这个尝试只显示模板,如果它存在,并使用以下模板标记解决方案:

仅在模板存在时包含模板

将以下内容放入 yourapp/templatetags/include_maybe.py

from django import template
from django.template.loader_tags import do_include
from django.template.defaulttags import CommentNode
register = template.Library()

@register.tag('include_maybe')
def do_include_maybe(parser, token):
    "Source: http://stackoverflow.com/a/18951166/15690"
    bits = token.split_contents()
    if len(bits) < 2:
        raise template.TemplateSyntaxError(
            "%r tag takes at least one argument: "
            "the name of the template to be included." % bits[0])

    try:
        silent_node = do_include(parser, token)
    except template.TemplateDoesNotExist:
        # Django < 1.7
        return CommentNode()

    _orig_render = silent_node.render
    def wrapped_render(*args, **kwargs):
        try:
            return _orig_render(*args, **kwargs)
        except template.TemplateDoesNotExist:
            return CommentNode()
    silent_node.render = wrapped_render
    return silent_node
Run Code Online (Sandbox Code Playgroud)

通过{% load include_maybe %}在模板顶部添加并使用{% include_maybe "my_template_name.html" %}代码,从模板中访问它.

这种方法具有捎带现有模板包含标记的良好副作用,因此您可以使用与普通模式相同的方式传递上下文变量{% include %}.

根据模板是否存在进行切换

但是,如果模板存在,我想在嵌入网站上添加一些额外的格式.{% if_template_exists %}我写了一个过滤器,让你可以使用现有的标签,而不是编写{% if %}标签.

为此,将以下内容放入yourapp/templatetags/include_maybe.py(或其他)

from django import template
from django.template.defaultfilters import stringfilter


register = template.Library()

@register.filter
@stringfilter
def template_exists(value):
    try:
        template.loader.get_template(value)
        return True
    except template.TemplateDoesNotExist:
        return False
Run Code Online (Sandbox Code Playgroud)

然后,从您的模板中,您可以执行以下操作:

{% load include_maybe %}

{% if "my_template_name"|template_exists %}
     <div>
         <h1>Notice!</h1>
         <div class="included">
             {% include_maybe "my_template_name" %}
         </div>
     </div>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

使用自定义过滤器而不是使用自定义标记的优点是您可以执行以下操作:

{% if "my_template_name"|template_exists and user.is_authenticated %}...{% endif %}
Run Code Online (Sandbox Code Playgroud)

而不是使用多个{% if %}标签.

请注意,您仍然需要使用include_maybe.

  • +1嘿我刚刚打电话给你,这很疯狂,但这是我的模板,所以`include_maybe`. (3认同)

ari*_*rie 1

include接受变量:

{% include template_name %}
Run Code Online (Sandbox Code Playgroud)

这样你就可以在你的视图中进行检查。

  • 如果模板不存在,不会引发 TemplateDoesNotExist 异常吗? (2认同)