Django:缩短模板中的代码并避免重复

时间:2019-01-19 15:45:18

标签: django

我在模板中写了以下内容。是否可以缩短该代码,因为request.resolver_match.namespaces当前是其中的两倍?

{% if 'admin' not in request.resolver_match.namespaces and 'website' not in request.resolver_match.namespaces %}

1 个答案:

答案 0 :(得分:0)

您可以:

  • 使用一个{% with %}

     {% with namespaces=request.resolver_match.namespaces %}
         {% if 'admin' not in namespaces and 'website' not in namespaces %}
         ...
         {% endif %}
     {% endwith %}
    
  • 使用上下文处理器

    def add_namespace(request):
        return {'namespaces': request.resolver_match.namespaces}
    
    {% if 'admin' not in namespaces and 'website' not in namespaces %}
    

    或:

    def check_namespace(request):
        invalid_namespaces = ['admin', 'website']
        namespaces_valid = all(
            s not in request.resolver_match.namespaces
            for s in invalid_namespaces
        )
        return {'namespaces_valid': namespaces_valid}
    

    您必须在context_processors设置中将路径添加到TEMPLATES的可调用对象列表。

  • 创建一个自定义模板过滤器来进行检查:

    # your_app/templatetags/namespaces.py
    @register.filter
    def namespaces_valid(value):
        invalid_namespaces = ['admin', 'website']
        return all(
            s not in request.resolver_match.namespaces
            for s in invalid_namespaces
        )
    
    {% load namespaces %}
    {% if request.resolver_match.namespaces|namespaces_valid %}
    

但是,我将退后一步,检查在尝试将模板绑定到URL上是否是一个好主意。我的猜测是您想在全局基本模板中做一些特定于应用程序的工作。也许您可以使用中间的基本模板并使用{% block %}来实现此目的:

 # base.html, which currently contains your {% if ... %}
 {% block not_admin_or_website %}
 {% endblock %}

 # base_not_admin_or_website.html
 {% extends 'base.html' %}
 {% block not_admin_or_website %}
     ... # whatever is in your if right now
 {% endblock %}