Я относительно новичок в кодировании, поэтому я прошу прощения за любую неопределенность или ошибку. Пожалуйста, поправьте меня. Я следовал учебному пособию Corey Schafers Flask, и в части 3 я застрял со следующей ошибкой: Jinja2.exceptions.UndefinedError: «объект wtforms.fields.core.UnboundField» не имеет атрибута «label» при попытке запустите следующую страницу регистрации:
зарегистрируйтесь. html
{% extends "layout.html" %}
{% block content %}
<div class="content-section">
<form method="POST" action="">
{{ form().hidden_tag() }}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Join Today</legend>
<div class="form-group">
{{ form.username.label(class="form-control-label") }}
{% if form.username.errors %}
{{ form.username(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.username.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.username(class="form-control form-control-lg") }}
{% endif %}
</div>
<div class="form-group">
{{ form.email.label(class="form-control-label") }}
{% if form.email.errors %}
{{ form.email(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.email.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.email(class="form-control form-control-lg") }}
{% endif %}
</div>
<div class="form-group">
{{ form.password.label(class="form-control-label") }}
{% if form.password.errors %}
{{ form.password(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.password.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.password(class="form-control form-control-lg") }}
{% endif %}
</div>
<div class="form-group">
{{ form.confirm_password.label(class="form-control-label") }}
{% if form.confirm_password.errors %}
{{ form.confirm_password(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.confirm_password.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.confirm_password(class="form-control form-control-lg") }}
{% endif %}
</div>
</fieldset>
<div class="form-group">
{{ form.submit(class="btn btn-outline-info") }}
</div>
</form>
</div>
<div class="border-top pt-3">
<small class="text-muted">
Already Have An Account? <a class="ml-2" href="{{ url_for('login') }}">Sign In</a>
</small>
</div>
{% endblock content %}
Дополнительные задействованные файлы:
forms.py
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo
class RegistrationForm(FlaskForm):
username = StringField('Username',
validators=[DataRequired(), Length(min=2, max=20)])
email = StringField('Email',
validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField('Confirm Password',
validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Sign Up')
class LoginForm(FlaskForm):
email = StringField('Email',
validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
remember = BooleanField('Remember Me')
submit = SubmitField('Login')
flaskblog.py
from flask import Flask, render_template, url_for
from forms import RegistrationForm, LoginForm
...
@app.route('/register')
def register():
form = RegistrationForm
return render_template('register.html', title='register', form=form)
Это обратная связь с сервера:
Traceback (most recent call last):
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\Musa\Desktop\Flask_Blog\flask_blog.py", line 39, in register
return render_template('register.html', title='register', form=form)
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\templating.py", line 140, in render_template
ctx.app,
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\flask\templating.py", line 120, in _render
rv = template.render(context)
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\jinja2\environment.py", line 1090, in render
self.environment.handle_exception()
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\jinja2\environment.py", line 832, in handle_exception
reraise(*rewrite_traceback_stack(source=source))
File "C:\Users\Musa\Desktop\Flask_Blog\lib\site-packages\jinja2\_compat.py", line 28, in reraise
raise value.with_traceback(tb)
File "C:\Users\Musa\Desktop\Flask_Blog\templates\register.html", line 1, in top-level template code
{% extends "layout.html" %}
File "C:\Users\Musa\Desktop\Flask_Blog\templates\layout.html", line 47, in top-level template code
{% block content %}{% endblock %}
File "C:\Users\Musa\Desktop\Flask_Blog\templates\register.html", line 9, in block "content"
{{ form.username.label(class="form-control-label") }}
jinja2.exceptions.UndefinedError: 'wtforms.fields.core.UnboundField object' has no attribute 'label'
Как мне подойти к решению этой проблемы? Я попытался просмотреть документацию WTForms и там было сказано:
"_ Если _form и _name не указаны, вместо него будет возвращено UnboundField. Вызовите его метод bind () с экземпляром формы и именем для создания поле. "
https://wtforms.readthedocs.io/en/stable/fields/#wtforms .fields.Label
Итак, я знаю, что атрибут метки не получает форму или имя, но что такое контроль формы делать? Я не знаю, как это понять. Я попытался вычитать код в папке Кори Шафера git, но все равно безрезультатно: https://github.com/CoreyMSchafer/code_snippets/tree/master/Python/Flask_Blog/03-Forms-and-Validation, пожалуйста, помогите!