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
.
include
接受变量:
{% include template_name %}
Run Code Online (Sandbox Code Playgroud)
这样你就可以在你的视图中进行检查。
归档时间: |
|
查看次数: |
6622 次 |
最近记录: |