【问题标题】:Render multiple templates at once in Flask在 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 之一上调用它。

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

【问题讨论】:

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

标签: templates render flask


【解决方案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 覆盖和你所做的一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
相关资源
最近更新 更多