Django OVERRIDE默认模板标签

时间:2018-08-06 09:59:22

标签: django django-templates

如果找不到反向匹配项,我想使{%url%}静默失败,只输出简单的“#”或默认首页链接。

如何在不将int amount = System.Convert.ToInt32(value); 添加到我的数百个HTML中的情况下完成此操作?有点像猴子打补丁,但已经可以投入生产了。

2 个答案:

答案 0 :(得分:1)

这应该有效, 在任何看起来像这样的应用程序中创建一个名为“ 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

的地方

答案 1 :(得分:0)

正如评论中所述,这通常不是您要执行的操作。但是,一种方法是使用变量:

{% url "some:url" as the_url %}
{{ the_url|default:"#"}}

这也可以写在一行上:

<a href="{% url "some:url" as the_url %}{{ the_url|default:"#"}}">...</a>