如果找不到反向匹配,我想让{% url%}静默失败,只输出一个简单的'#‘或默认主页链接。
如果不将{% load tags %}添加到我的100多个HTML中,我如何才能做到这一点?有点像猴子的补丁,但要做好生产准备。
发布于 2018-08-06 19:24:19
这应该会起作用,在任何应用程序中创建一个名为'builtins.py‘的文件,如下所示
from django import template
from django.template.defaulttags import url
from django.urls.exceptions import NoReverseMatch
register = template.Library()
def decorator(func):
def wrap(*args, **kwargs):
try:
return func(*args, **kwargs)
except NoReverseMatch:
return '#'
return wrap
@register.tag(name='url')
def custom_url(parser, tokens):
url_node = url(parser, tokens)
url_node.render = decorator(url_node.render)
return url_node在您的settings.py文件中
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'builtins': ['app_name.builtins'], # <-- Here
},
},
]app_name是您创建builtins.py的位置
发布于 2018-08-06 18:33:33
正如评论中所述,这不是您通常想要做的事情。但是,一种方法是使用变量:
{% url "some:url" as the_url %}
{{ the_url|default:"#"}}这也可以写在一行上:
<a href="{% url "some:url" as the_url %}{{ the_url|default:"#"}}">...</a>https://stackoverflow.com/questions/51705004
复制相似问题