jinja2.exceptions.UndefinedError: «объект str» не имеет атрибута «имя пользователя» - PullRequest
0 голосов
/ 22 декабря 2018

У меня проблемы с тем, чтобы приложение фляги распознало переменные формы при попытке загрузить страницу register.html.Я попытался перезагрузить мой virtualenv и попытался загрузить код шаблона от другого человека, и я получаю ту же ошибку.Вот обратная связь, которую я получаю.

File "s:\projects\gameapp\env\lib\site-packages\flask\app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "s:\projects\gameapp\env\lib\site-packages\flask\app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "s:\projects\gameapp\env\lib\site-packages\flask\app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "s:\projects\gameapp\env\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "s:\projects\gameapp\env\lib\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "s:\projects\gameapp\env\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "s:\projects\gameapp\env\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "s:\projects\gameapp\env\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "s:\projects\gameapp\env\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "s:\projects\gameapp\env\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "S:\Projects\gameapp\gameapp.py", line 35, in register
return render_template('register.html', title='Register', form='form')
File "s:\projects\gameapp\env\lib\site-packages\flask\templating.py", line 135, in render_template
context, ctx.app)
File "s:\projects\gameapp\env\lib\site-packages\flask\templating.py", line 117, in _render
rv = template.render(context)
File "s:\projects\gameapp\env\lib\site-packages\jinja2\asyncsupport.py", line 76, in render
return original_render(self, *args, **kwargs)
File "s:\projects\gameapp\env\lib\site-packages\jinja2\environment.py", line 1008, in render
return self.environment.handle_exception(exc_info, True)
File "s:\projects\gameapp\env\lib\site-packages\jinja2\environment.py", line 780, in handle_exception
reraise(exc_type, exc_value, tb)
File "s:\projects\gameapp\env\lib\site-packages\jinja2\_compat.py", line 37, in reraise
raise value.with_traceback(tb)
File "S:\Projects\gameapp\templates\register.html", line 1, in top-level template code
{% extends "layout.html" %}
File "S:\Projects\gameapp\templates\layout.html", line 44, in top-level template code
{% block content %}{% endblock %}
File "S:\Projects\gameapp\templates\register.html", line 9, in block "content"
{{ username.label(class="form-control-label") }}
File "s:\projects\gameapp\env\lib\site-packages\jinja2\environment.py", line 430, in getattr
return getattr(obj, attribute)

Вот моя страница registration.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") }}
                    {{ form.username(class="form-control form-control-lg") }}
                </div>
                <div class="form-group">
                    {{ form.email.label(class="form-control-label")}}
                    {{ form.email(class="form-control form-control-lg")}}
                </div>
                <div class="form-group">
                    {{ form.password.label(class="form-control-label") }}
                    {{ form.password(class="form-control form-control-lg") }}
                </div>
                <div class="form-group">
                    {{ form.confirm_password.label(class="form-control-label") }}
                    {{ form.confirm_password(class="form-control form-control-lg") }}
                </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 %}

Я попытался удалить код, на котором выдает ошибку, и я простов следующей строке выдается ошибка, в которой отсутствует атрибут «email», я думаю, что это связано с ошибкой версии, поскольку все работает хорошо, кроме этого (в настоящее время).Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Как отмечает пользователь @ Andellys , вам следует перейти с class на class_, но, возможно, вы еще не создали свою форму.Пожалуйста, проверьте ответ: hidden_tag () отсутствует 1 обязательный позиционный аргумент: 'self' в формах фляги? .

0 голосов
/ 10 июля 2019

Перед тем, как решить вашу ошибку, вам необходимо сначала ее понять.

Здесь ошибка ясно говорит о том, что str object не имеет атрибута username.Это означает, что объект, который использует атрибут с именем username, имеет тип str (тогда как он должен быть объектом класса формы).

Было бы легко, если бы вы опубликовали код Pythonформа также, но все же я попытаюсь выяснить проблему.

Допустим, имя класса вашей формы Форма , то есть его объявление выглядит так:

class Form(FlaskForm):

тогда в вашем файле python, который отображает registration.html, вам нужно будет сделать что-то вроде

form = Form()

Лучше всего, вы указали имя своего класса в кавычках

forms = 'Forms()'

и из-за этого python интерпретирует его как объект str, а не как объект Form

Так что просто удалите цитаты из оператора экземпляра, и все готово.

Надеюсь, это поможет:)

0 голосов
/ 22 декабря 2018

Вам нужно использовать атрибут «class_» для обозначения, а не «class», что означает, что вам нужно исправить

{{ form.username.label(class="form-control-label") }}

на

{{ form.username.label(class_="form-control-label") }}

и так далее на протяжении всегошаблон.

...