【问题标题】:Jinja2 Exceptions - Cannot find attributeJinja2 异常 - 找不到属性
【发布时间】:2019-03-21 05:26:00
【问题描述】:

在 Flask/Python 中解决问题。如果出现其中一些错误,我已经能够在它们出现时将它们压扁;但是,我似乎无法深入了解这一点。

我有一个允许用户登录的简单表单。

但是每次我加载页面时都会遇到这个错误:

jinja2.exceptions.UndefinedError: 'shop.forms.LoginForm object' 没有属性'submit'

以下是我正在使用的代码,在此先感谢。

附言我看过关于 hidden_​​tag() 属性的类似帖子,但建议的修复方法不适用于这种情况。

routes.py

import os
from flask import render_template, url_for, request, redirect, flash
from shop import app, db
from shop.models import Author, Book, User
from shop.forms import RegistrationForm, LoginForm
from flask_login import login_user, current_user, logout_user, login_required


@app.route("/login", methods=['GET', 'POST'])
def login():
form = LoginForm()
if request.method == 'POST':
    user = User.query.filter_by(email=form.email.data).first()
    if user is not None and user.verify_password(form.password.data):
        login_user(user)
        return redirect(url_for('home'))
return render_template('login.html', title='Login', form=form)

forms.py

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo

class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
sumbit = SubmitField('Login')

login.html

<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>



{% extends "layout.html" %}
{% block content %}

<form method="POST" action="">
    {{ form.csrf_token }}
    <div class="">
        {{ form.email.label }} {{ form.email}}
    </div>
    <div class="">
    {{ form.password.label }} {{ form.password}}
    </div>
    <div class="">
        {{ form.submit() }}
    </div>
</form>

{% endblock content %}

</body>
</html>

编辑:从提交中删除 () 并不能解决问题。只需从模板中完全删除按钮的实例。见下文:

【问题讨论】:

    标签: html flask jinja2 flask-wtforms


    【解决方案1】:

    form.submit() 更改为form.submit,它将在模板中显示提交按钮。

    这是一个使用flask_wtf 登录表单的示例。

    Flask wtform 使用示例:

    app.py:

    from flask import render_template, url_for, request, redirect, flash, Flask
    from forms import LoginForm
    
    app = Flask(__name__)
    app.secret_key = 'secret key'
    
    @app.route("/login", methods=['GET', 'POST'])
    def login():
        form = LoginForm()
        if request.method == 'POST':
            user_email = form.email.data
            user_password = form.password.data
            if user_email and user_password:
                return "{} - {}".format(user_email, user_password)
        return render_template('login.html', title='Login', form=form)
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    forms.py:

    from flask_wtf import FlaskForm
    from wtforms import StringField, PasswordField, SubmitField, BooleanField
    from wtforms.validators import DataRequired, Length, Email, EqualTo
    
    class LoginForm(FlaskForm):
        email = StringField('Email', validators=[DataRequired(), Email()])
        password = PasswordField('Password', validators=[DataRequired()])
        submit = SubmitField('Login')
    

    login.html:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Login</title>
    </head>
    <body>
    
    <form method="POST" action="">
        {{ form.csrf_token }}
        <div class="">
            {{ form.email.label }} {{ form.email }}
        </div>
        <div class="">
            {{ form.password.label }} {{ form.password }}
        </div>
        <div class="">
            {{ form.submit }}
        </div>
    </form>
    
    </body>
    </html>
    

    输出:

    获取login路由的请求:

    login路由的post请求:

    更新:

    requirements.txt:

    Click==7.0
    Flask==1.0.2
    Flask-WTF==0.14.2
    itsdangerous==1.1.0
    Jinja2==2.10
    MarkupSafe==1.1.1
    Werkzeug==0.15.0
    WTForms==2.2.1
    

    我在我的机器和c9.io 中都成功运行了这段代码。

    获取/login 路由请求(在提交表单之前):

    提交表单后:

    【讨论】:

    • 不幸的是,我尝试了这个,但没有任何结果。现在根本不显示按钮。还有其他想法吗?
    • @Matt,很高兴听到您解决了这个问题。就我而言,我可以使用此代码获取登录按钮。登录按钮显示在我的本地机器和 c9.io 中。我已经更新了答案。
    • 我的导入使用略有不同的版本,我也使用 Flask-Login 来管理我的登录系统。这可能就是我们的差异所在。
    【解决方案2】:

    问题解决了!

    我在 forms.py 中没有正确拼写 submit

    一个简单的笔误,花了我 2 个小时。

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 2012-02-17
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2016-05-14
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多