在 Flask 中一次渲染多个模板

Posted

技术标签:

【中文标题】在 Flask 中一次渲染多个模板【英文标题】:Render multiple templates at once in Flask 【发布时间】:2012-06-12 09:24:22 【问题描述】:

我正在制作一个 Flask 应用程序。我有一个登录区,一个博客区。如果我想获取用户的登录信息,我将渲染登录模板。但这不会呈现必须显示在登录区域下方的博客模板。 :/

我会尽量说清楚:

% block login % % endblock %
blah blah
% block blog_display % % endblock %

现在我有一个 login.html 扩展它,并进入登录块。我有一个blogs.html,它进入blog_display。如何渲染两者?当我执行render_template() 时,我只能在login.htmlblogs.html 之一上调用它。

请帮帮我。如果您要求,我会提供更多详细信息。

【问题讨论】:

更好的是,如果您的主模板中有两个块,并且您想从两个不同的子模板中获取它们,您会怎么做?如果没有办法,你如何解决危机? 【参考方案1】:

Sean 的回答效果很好,但如果你不想扩展块,你可以选择一个更简单的解决方案,我更喜欢这个。

% include "partials/login.html" %

只需在需要包含模板的任何地方使用它

【讨论】:

如果我们想向这个模板传递一些参数,比如一个指示用户是否登录的变量以相应地调整视图。【参考方案2】:

您可能以错误的方式考虑布局。您的布局是模板中通用的,而不是最复杂的。如果您需要很少的自包含功能,那么按原样写下来,然后在需要的地方写上include

也就是说,如果你想要这样的东西:

----------------------------------
                  +--------------+
  Header          |   Login      |
                  +--------------+
----------------------------------

  Body Content (Blog)

你还想拥有一个像这样的独立登录页面:

----------------------------------

  Header

----------------------------------

  +--------------+
  |   Login      |
  +--------------+

然后在你需要的地方创建一个登录部分并include它。

示例

模板/partials/login.html

<form action="/login" method="post">
<!-- Your login goes here -->
</form>

templates/your_base.html

<!DOCTYPE html>
<html>
<head>
% block head %
# 
Default HEAD content goes here 
with extra nested blocks for children to override 
if needed. 
#
% endblock head %
</head>
<body>
<header>% block header %% endblock header %</header>
# Note: This assumes we *always* want a header #
% block content %% endblock content %
</body>
</html>

templates/login.html

% extends "your_base.html" -%
% block content -%
% include "partials/login.html" %
%- endblock content %

templates/blog.html

% extends "your_base.html" -%
% block header -%
 super() # Render the default header contents here #
% include "partials/login.html" %
%- endblock header %
% block content -%
# Render your blog posts here #
%- endblock content %

【讨论】:

你先说“块头”,然后是“块头”。是不是打错字了? your_base 有一个 head 和一个 header 部分 - 我们只覆盖 blog 中的 header 但我想表明你可以有部分你 don' t 覆盖和你所做的一样。

以上是关于在 Flask 中一次渲染多个模板的主要内容,如果未能解决你的问题,请参考以下文章

Flask 渲染跨服务器的html模板

Flask 的模板渲染

如何防止 map() 在 react-native 中一次渲染整个数组

Flask: 渲染模板

Flask 学习-4.templates 渲染模板

在渲染模板中将变量从python(flask)传递给HTML?