Jinja2 Исключения - Не удается найти атрибут - PullRequest
1 голос
/ 21 марта 2019

Работа над проблемой во Flask / Python. Было несколько таких ошибок, и я смог их раздавить по мере их появления; тем не менее, этот, который я, кажется, не могу понять до конца.

У меня есть простая форма, которая позволяет пользователям войти в систему.

Но каждый раз, когда я загружаю страницу, меня встречает эта ошибка:

jinja2.exceptions.UndefinedError: 'объект shop.forms.LoginForm' не имеет атрибута 'submit'

Ниже приведен код, с которым я работаю, заранее спасибо.

p.s. Я видел похожие посты относительно атрибута 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>

EDIT: удаление () из submit не решает проблему. Просто удаляет экземпляр кнопки полностью из шаблона. Смотрите ниже:

Screenshot of form on website.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Измените 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 Маршрут:

Get request of login route

Почтовый запрос login Маршрут:

Post request of login route

Обновления:

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 (до отправки формы):

before submitting the login form

После отправки формы:

after submitting the login form

0 голосов
/ 21 марта 2019

Проблема решена!

Я не написала правильно в forms.py

Простая канцелярская ошибка, которая стоила мне 2 часа.

...