Как решить эту проблему Flask -WTF: Jinja2.exceptions.UndefinedError: «объект wtforms.fields.core.UnboundField» не имеет атрибута «label» - PullRequest
0 голосов
/ 28 апреля 2020

Я относительно новичок в кодировании, поэтому я прошу прощения за любую неопределенность или ошибку. Пожалуйста, поправьте меня. Я следовал учебному пособию 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, пожалуйста, помогите!

1 Ответ

0 голосов
/ 28 апреля 2020

В вашем flaskblog.py вы назначаете class RegistrationForm как переменную форму. Не экземпляр . Эта добавляющая скобка должна исправить это.

@app.route('/register')
def register():
    form = RegistrationForm() # Added parenthesis here. 
    return render_template('register.html', title='register', form=form)
...