【问题标题】:WTForms in Flask: UndefinedError: 'form' is undefined烧瓶中的WTForms:UndefinedError:'form'未定义
【发布时间】:2015-12-04 08:26:18
【问题描述】:

我是 Flask 和 WTForms 的新手,我无法呈现我的 HTML 页面。我一遍又一遍地浏览了 WTforms 文档,但我找不到错误的根源:

jinja2.exceptions.UndefinedError, UndefinedError: 'form' is undefined

我的代码如下:

forms.py

from flask.ext.wtf import Form
from wtforms import TextField, BooleanField, TextAreaField, StringField, PasswordField, SelectField, validators

class LoginForm(Form):
    username = TextField('Username', [
        validators.Required(), 
        validators.Length(min=4, max=25)
    ])
    password = PasswordField('New Password', [
        validators.Required()
    ])

app.py

from forms import *
from wtforms import Form, fields, BooleanField, TextField, StringField,     PasswordField, validators
from werkzeug.security import generate_password_hash, \
 check_password_hash

@app.route('/login/', methods=['GET', 'POST'])
def login():
    form = LoginForm(request.form)
    if request.method == 'POST' and form.validate():
        if load_user(form.username.data) is None:
            flash('Invalid username')
        else: 
            if check_password_hash(cred.password, form.password.data):
                return redirect(url_for('browse'))  
            else: 
                flash('Invalid password')
    return render_template('login.html', title='Login', form=form)

login.html

{% extends "base.html" %}
{% block body %}
    <form action="{{ url_for('login') }}" method="Post">
        <fieldset>
            <div>{{ form.username.label }}: {{ form.username() }}</div>
            <div>{{ form.password.label }}: {{ form.password() }}</div>
            <div class="form-group">
                <button class="btn btn-default" type="submit">
                    <span aria-hidden="true" class="glyphicon glyphicon-log-in"></span>
                    Log In
                </button>
            </div>
        </fieldset>
    </form>    
    <div>
    or <a href="new">Register</a> for an account
    </div>
{% endblock %}

【问题讨论】:

  • 你能修复视图中的缩进吗?事实上,很难说到底发生了什么。发布完整的回溯也可能会有所帮助。
  • 其实我看到之前的编辑改了。 @KevinGuan,请不要不必要地更改人们的代码,尤其是在以前正确的地方弄错。
  • @DanielRoseman:抱歉...不知道 Stack-Exchange-Editor-Toolkit 出了什么问题,我只是想删除 thanks 并修复错误消息格式。
  • 我无法重现您的错误。如果我在第一个条件下评论了所有内容,它就会起作用。对于完整的测试,我需要知道 load_user() 的实现。以及何时发生错误?或者您的项目是否有公共 git 存储库?

标签: python flask wtforms


【解决方案1】:

您仍然必须使用 return 语句 - 例如:

return render_template('login.html', title='Login', form=form)

在所有if-else 分支中,因为否则form 上下文变量不会传递给模板。 login 函数应如下所示:

@app.route('/login/', methods=['GET', 'POST'])
def login():
    form = LoginForm(request.form)
    if request.method == 'POST' and form.validate():
        if load_user(form.username.data) is None:
            flash('Invalid username')
            return render_template('login.html', title='Login', form=form)
    else: 
        if check_password_hash(cred.password, form.password.data):
            return redirect(url_for('browse'))  
        else: 
            flash('Invalid password')
            return render_template('login.html', title='Login', form=form)
    return render_template('login.html', title='Login', form=form)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2020-09-24
    • 1970-01-01
    • 2021-05-20
    • 2023-04-03
    相关资源
    最近更新 更多