如何在Django中使用if语句编写更好的模板逻辑?

时间:2016-02-17 20:50:55

标签: django

如何在Django模板中更有效地编写它,这样它就不会成为一个巨大的if语句?我想禁用request.path中的所有页面的元素和某些页面的一些例外。这是我到目前为止所得到的

{% if "/create-account/" in request.path or "/lists/" in request.path or "/contact-us/" in request.path or "/news/" in request.path %}
{% else %}
    {% include 'includes/element.html' %}
{% endif %}

必须有更好的方法。 澄清我的需求:

在除X,Y或Z之外的所有页面上显示此元素。

4 个答案:

答案 0 :(得分:1)

我能想到的最短路径是在上下文数据中包含一个上下文变量,用于那些需要显示它的网址

# views
{ 'ignore_element': ':)' }

# template
{% if not ignore_element %}
    {% include 'includes/element.html' %}
{% endif %}

这可以起作用,因为它仅显示那些不包含此上下文值的那些。

任何更好的解决方案选择都取决于为什么这4个应该免于显示它的逻辑

答案 1 :(得分:1)

我不会直接使用请求对象。

views.py

def contact_us(request):
    my_context = {
        "hide_element_include": True
    }
    return render_to_response('my_template.html',
                      my_context,
                      context_instance=RequestContext(request))

的index.html

{% if hide_element_include %}
{% else %}
    {% include 'includes/element.html' %}
{% endif %}

答案 2 :(得分:1)

在大多数情况下,尝试保留模板的逻辑 。假设这个页面由Django控制器提供服务,你需要做的就是为你想要隐藏元素的每个URL添加一个标志。

def contact_us(request):
    context = {
        "hide_element": True
    }
    return render('my_template.html', context);

模板:

{% if not hide_element %}
    {% include 'includes/element.html' %}
{% endif %}

答案 3 :(得分:0)

如果您只有几页没有"元素"。

,请考虑这种更简单的方法

base.html文件:

{% block some_element %}
  {% include 'includes/element.html' %}
{% endblock %}
{% block content %}
{% endblock %}

pages_with_element.html:

{% extend 'base.html' %}
{% block content %}
  <h1>content here</h1>
{% endblock %}

page_without_element.html:

 {% extend 'base.html' %}
 {% block some_element %}
 {% endblock %}

 {% block content %}
  <h1>content here</h1>
 {% endblock %}