发布
社区首页 >问答首页 >Jinja2异常-找不到属性

Jinja2异常-找不到属性
EN

Stack Overflow用户
提问于 2019-03-21 05:26:00
回答 2查看 2K关注 0票数 1

在Flask/ Python中处理一个问题。如果这些错误中有几个会弹出,当它们出现时,我就能消除它们;然而,这个错误我似乎无法理解到底。

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

但是每次加载页面时,都会遇到这样的错误:

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

下面是我正在使用的代码,谢谢。

附注:我已经看到了关于hidden_tag()属性的类似文章,但是建议的修复并不适用于这个场景。

routes.py

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
<!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>

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

EN

回答 2

Stack Overflow用户

发布于 2019-03-21 06:10:34

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

下面是一个将flask_wtf用于登录表单的示例。

使用水瓶wtform的示例:

app.py

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
<!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路由请求:

更新:

requirements.txt

代码语言:javascript
代码运行次数:0
复制
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路由请求(在提交表单之前):

提交表格后:

票数 1
EN

Stack Overflow用户

发布于 2019-03-21 14:24:43

问题解决了!

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

简单的文书错误花了我两个小时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55274250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档