有没有办法将变量传递给 Django 中的“扩展”模板?

Posted

技术标签:

【中文标题】有没有办法将变量传递给 Django 中的“扩展”模板?【英文标题】:Is there a way to pass a variable to an 'extended' template in 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") 传递变量? 【参考方案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="widthsidebar_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 % 标记中,您在其中声明的所有变量也将在父模板中可用。

【讨论】:

以上是关于有没有办法将变量传递给 Django 中的“扩展”模板?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将变量传递给 django 模板中的 <div> id?

如何将javascript变量传递给django自定义过滤器

如何将javascript变量传递给django自定义过滤器

将变量传递到扩展模板?

Django 表单向导 - 将请求传递给视图?

如何将 Django 变量传递给 Javascript