有没有办法将变量传递给 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_width
和 sidebar
在layout.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自定义过滤器