Python 金甲2号表格包括韩元';行不通
我正在用烧瓶和金杯做我的第一步。我已经浏览了一些示例,但现在我尝试集成flask安全性,但遇到了一些问题 我尝试用一个登录表单构建一个模式,因此我设置了一个div,如下所示:Python 金甲2号表格包括韩元';行不通,python,html,forms,flask,jinja2,Python,Html,Forms,Flask,Jinja2,我正在用烧瓶和金杯做我的第一步。我已经浏览了一些示例,但现在我尝试集成flask安全性,但遇到了一些问题 我尝试用一个登录表单构建一个模式,因此我设置了一个div,如下所示: <div class="modal"> <h3>Login</h3> <form action="{{ url_for_security('login') }}" method="POST" name="login_user_form"> {{ login_user_
<div class="modal">
<h3>Login</h3>
<form action="{{ url_for_security('login') }}" method="POST" name="login_user_form">
{{ login_user_form.hidden_tag() }}
{{ render_field_with_errors(login_user_form.email) }}
{{ render_field_with_errors(login_user_form.password) }}
{{ render_field_with_errors(login_user_form.remember) }}
{{ render_field(login_user_form.next) }}
{{ render_field(login_user_form.submit) }}
</form>
from flask.ext.security import LoginForm, RegisterForm
...
@app.context_processor
def inject_userForms():
return dict(login_user_form=LoginForm(), register_user_form=RegisterForm() )
并试图在layout.html中通过
{% block loginModal %}{% endblock %}
现在我了解到这不是一种方式,因为内容是呈现的,layout.html只被调用
现在,我试图通过include语句将代码直接放入layout.html,但由于这不起作用,我直接将其放入
我还补充说
{% from "security/_macros.html" import render_field_with_errors, render_field %}
在第一行中,它们是flask安全包提供的宏。但我得到的只是一个错误:
UndefinedError: 'login_user_form' is undefined (after a long traceback)
我完全被困在这里,在网站上阅读jinja2文档已经有一个小时了。我怎样才能使这张表格生效
更新(很抱歉,更新太晚):
My layout.html,它实现了所有页面的基本布局
<!doctype html>
<html>
<head>
<title>MyExample</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/style.css') }}">
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/gumby.css') }}">
</head>
<body>
<div class=page>
<nav id="navbar-main-nav" class="navbar">
<div class="row">
<a class="toggle" gumby-trigger="#navbar-main-nav #main-nav" href="#"><i class="icon-menu"></i></a>
<h1 class="four columns logo"><a href="/">Logo</a></h1>
<nav class="five columns pull_right">
<ul id="main-nav">
<li><a href="/link1/"><span>Link1 </span></a></li>
<li><a href="/link2/"><span>Link2</span><i class="icon-cog" title="Customize"></i></a></li>
{% if current_user.is_authenticated() %}
<li>Hello {{ current_user.name }}</li>
<li><a href="{{ url_for('security.logout') }}">Logout</a></li>
{% else %}
<li><a href="#" class="switch" gumby-trigger="#modal1">Open Modal</a></li>
<li><a href="{{ url_for('security.register') }}">Register</a></li>
{% endif %}
</ul>
</nav>
</div>
</nav>
<div class="modal" id="modal1">
<div class="content">
<a class="close switch" gumby-trigger="|#modal1"><i class="icon-cancel" /></i></a>
<div class="row">
<div class="ten columns centered">
<div class="row">
<div class="five columns">
{% block loginModal %}{% endblock %}
</div>
<div class="five columns">
<!-- register Form -->
</div>
</div>
</div>
</div>
</div>
</div>
{% block body %}{% endblock %}
</div>
<script src="{{ url_for('static', filename='js/libs/modernizr-2.6.2.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/libs/jquery-2.0.2.min.js') }}"></script>
<script gumby-touch="js/libs/" src="{{ url_for('static', filename='js/libs/gumby.min.js') }}"></script>
</body>
</html>
我将表单直接添加到layout.html中,现在效果很好。根本不起作用的是包含块。如果我使用blockception,即在内容块中使用login块,它就会起作用 您的错误是:
UndefinedError:“登录\用户\表单”未定义
这是来自模板,看起来像这样
{% extends layout.html %}
{% block loginModal %}
{% from "security/_macros.html" import render_field_with_errors, render_field %}
{% include "security/_messages.html" %}
<h3>Login</h3>
<form action="{{ url_for_security('login') }}" method="POST" name="login_user_form">
{{ login_user_form.hidden_tag() }}
{{ render_field_with_errors(login_user_form.email) }}
{{ render_field_with_errors(login_user_form.password) }}
{{ render_field_with_errors(login_user_form.remember) }}
{{ render_field(login_user_form.next) }}
{{ render_field(login_user_form.submit) }}
</form>
{% endblock %}
如果没有将“login\u user\u form”作为参数传递给render\u模板,则会出现错误
如果您希望在应用程序的其他地方(如a中)的模板上下文中定义
login\u user\u form
,那么请确保应用程序的该部分确实正常工作。您所说的“现在我了解的不是这样,因为内容是呈现的,layout.html只是调用的”是什么意思?就我而言,你提供的方式将是正确的做事方式。也许您可以提供您尝试如何使用此方法的完整来源?另外,您的表单HTML中似乎缺少一个结束元素
,不确定这是否是导致问题的原因。因此layout.HTML(通常称为base.HTML)构建了我的线框。并且有一个{%block body%}{%endblock%}然后呈现内容。我还有一个index.html来呈现主体。我在谷歌上搜索了很多东西,发现了几个条目,它们说如果一个块应该呈现,它必须在呈现的模板中,在本例中是index.html,而不是layout.html/base.html。我试着举一个较长的例子。我理解这一点,但我想说的是,我认为您在设置layout.html和使用layout.html的模板时可能会有一些错误。你说你是如何改变你在问题中提供的文件的,但是我们没有看到你修改的实际结果,我们不确定你是否真的做了正确的修改。请修改问题以向我们提供模板的版本(layout.html和子模板),然后是它正在输出的html。最后,告诉我们你希望它输出什么。我用一个例子编辑了原始文章。我希望输出的是layout.html中的登录表单,在每个页面上都可以使用model进行登录或注册。当我读到这篇文章时,我发现我忘记了信息,在更新的示例中,表单没有呈现出任何错误。我已经更新了我原来的帖子。通过再次阅读:你是对的,但是我在哪里可以实现基本html的这个视图呢。由于我从未直接调用它以通过路由进行渲染,所以我不知道如何实现渲染的未路由实现。实际上,这对我帮助很大,因为它似乎是实现可重用小部件的关键信息。我仍然不理解你的问题。归根结底,你可以把Jinja使用的extends
和block
看作是将多个模板组合成一个大模板的简单方法。然后,它将使用模板上下文来计算诸如login\u user\u form
之类的内容。无论您尝试在layout.html
中使用login\u user\u表单
,还是在login.html
页面中使用,login\u user\u表单
仍然需要在上下文中。您可以使用参数render_template
,或者使用模板上下文处理器(正如我在回答中链接到的那样)。此外,在这个问题和Flask的bug报告中,您讨论了base.html
和layout.html
。你确定没有混淆它们吗?所以你是对的:我阅读了有关模板上下文处理器的链接文档。我还发现,flask security提供了基本表单,如登录表单作为导入:from flask.ext.security LoginForm
,然后我可以在这样的上下文处理器中使用它@app.context\u processor def inject\u userForms():return dict(login\u user\u form=LoginForm())
from flask.ext.security import LoginForm, RegisterForm
...
@app.context_processor
def inject_userForms():
return dict(login_user_form=LoginForm(), register_user_form=RegisterForm() )
{% extends layout.html %}
{% block loginModal %}
{% from "security/_macros.html" import render_field_with_errors, render_field %}
{% include "security/_messages.html" %}
<h3>Login</h3>
<form action="{{ url_for_security('login') }}" method="POST" name="login_user_form">
{{ login_user_form.hidden_tag() }}
{{ render_field_with_errors(login_user_form.email) }}
{{ render_field_with_errors(login_user_form.password) }}
{{ render_field_with_errors(login_user_form.remember) }}
{{ render_field(login_user_form.next) }}
{{ render_field(login_user_form.submit) }}
</form>
{% endblock %}
def my_view():
# ...
return render_template('login.html', login_user_form=login_user_form)