代码之家  ›  专栏  ›  技术社区  ›  EralpB

Django重写默认模板标记

  •  0
  • EralpB  · 技术社区  · 6 年前

    如果没有找到反向匹配,我想让{%url%}以静默方式失败,只输出一个简单的“35;”或默认主页链接。

    我怎么能不加 {% load tags %} 我的100个HTMLs?有点像猴子修补,但有些东西生产准备。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Mohit Solanki MatúÅ¡ Bartko    6 年前

    这应该管用, 在任何类似这样的应用程序中创建名为“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

        2
  •  0
  •   ikkuh    6 年前

    如评论中所述,这不是你通常想做的事情。但是,一种方法是使用变量:

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

    这也可以写在一行上:

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