【问题标题】:Is there a way to pass a variable to an 'extended' template in Django?有没有办法将变量传递给 Django 中的“扩展”模板?
【发布时间】:2016-08-26 02:49:58
【问题描述】:

我想为我的布局模板增加一些灵活性,但我找不到任何方法来做到这一点。

我正在寻找一种方法来extend 带有变量的布局模板,即在模板树中向上传递变量,而不是向下传递。

# views.py
def my_view_func(request):
    return render(request, "child.html")

# child.html
{% extends 'layout.html' with show_sidebar=True sidebar_width_class="width_4" %}

<div>Templates stuff here</div>

# layout.html
{% if show_sidebar %}
    <div class="{{ sidebar_width_class }}">
        {% block sidebar %}{% endblock %}
    </div>
{% endif %}

我必须维护四个模板,只需要几行代码。例如,我有两个模板,它们的侧边栏宽度类不同。我做错了吗?

【问题讨论】:

  • @xpy,不。在我的问题中,我正在寻找一种使用变量扩展布局模板的方法,即在模板树中向上传递变量而不是向下传递。
  • 抱歉,误会了。
  • 为什么不通过上下文render(request, "child.html", {'sidebar_width': "width_4"}) 传递变量?

标签: django django-templates


【解决方案1】:

您需要的是一个包含模板标签。您可以在另一个模板中包含一个模板并使用特定的上下文呈现它。

{% include 'layout.html' with sidebar=True sidebar_width=4 %}

在此处查看文档:https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#include

【讨论】:

  • 我想扩展模板,而不是包含它。
  • 您的侧边栏部分看起来像一个 sn-p 并且可以通过上下文进行配置,那么为什么不将侧边栏 sn-p 保留在模板中并将其包含在具有特定上下文的其他模板中呢?你应该认为侧边栏是一个通用的可配置模板,而不是从它扩展而来。
  • 侧边栏肯定是,没有侧边栏的布局模板呢? f.e.我的页面有侧边栏宽度 3、宽度 4 并且根本没有侧边栏。这三种布局的内容部分彼此不同,并且内容部分标记每次都包含在 {% block content %} 中非常复杂
  • 也许有一个带有 {% include 'layout.html' with sidebar=sidebar sidebar_width=sidebar_width %} 的父模板,如果您需要更加动态,可以在上下文中从后端发送这些值?
  • 我现在正在考虑双扩展。主要布局与所有站点标记(头、页眉、页脚)通用的次要布局与 {%block content%} 标记但它仍然存在问题,因为我使用了类似 css 框架的引导程序。当我声明侧边栏宽度为 3 时,我还必须声明内容宽度 {{maxwidh}}-3。
【解决方案2】:

我怀疑block 是您首先要查找的内容。

在基本模板中形成你的块,如下所示:

{% block sidebar_wrapper %}
    {% if sidebar %}
    <div class="width{{sidebar_width}}">
        {% block sidebar %}{% endblock %}
    </div>
    {% endif %}
{% endblock sidebar_wrapper%}

在您的子模板上:

{% extends 'layout.html' %}
{% block sidebar_wrapper %}
    {% with sidebar=True sidebar_width=4 %}
        {{ block.super }}
    {% endwith%}
{% endblock sidebar_wrapper%}

【讨论】:

  • nope.. 您的示例是关于向下传递变量。当我们渲染模板和扩展布局时,我们没有这种可能性。
  • 我已经更新了我的问题,希望现在会更清楚。
  • @AlexT 这怎么“倒”? sidebar_wrapper 在父模板和子模板中,您可以使用with 语句定义在父模板的块中使用哪些值。
  • 这对你有用吗?我已经测试了你的解决方案,sidebar_widthsidebarlayout.html 中都是空白的
  • @AlexT 是的,确实如此。我没有用嵌套块测试它。我使用基本模板上的sidebar_wrapper 和扩展基本模板的模板内的with 语句对其进行了测试。
【解决方案3】:

您可以通过一些技巧来实现这一点。我会展示代码然后在下面解释。

# layout.html

{% block content %}
    {% if show_sidebar %}
        <div class="{{ sidebar_width_class }}">
            {% block sidebar %}{% endblock %}
        </div>
    {% endif %}
{% endblock %}
# child.html

{% extends 'layout.html' %}

{% block content %}
    {% with show_sidebar=True sidebar_width_class="width_4" %}
        {{ block.super }}
    {% endwith %}
{% endblock %}
  • layout.html 中,将所有内容包裹在{% block content %}
  • child.html 中,{{ block.super }} 就像python 的super(),它渲染父模板块中的所有内容。因此,如果您将其包装在 {% with %} 标记中,您在其中声明的所有变量也将在父模板中可用。

【讨论】:

    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多