windows WTForms字段在运行时显示,但存在未绑定问题

5vf7fwbs  于 2022-11-26  发布在  Windows
关注(0)|答案(1)|浏览(184)

我是新来的 flask 和JS,所以我真的不知道这里的问题是什么。
app.py

@app.route('/email', methods=["GET", "POST"])
def email(): 
    email_form = EmailForm(csrf_enabled=False) 
    return render_template("email-form.html", template_form=email_form, action='/appliance2', method='POST')

forms.py (我使用wtForms文档中的模板创建了该验证器)

class DBPresenceCheck(object):
    def __init__(self, table, message="Field is invalid"):
        self.table = table
        self.message = message

    def __call__(self, form, field):
        presence = Connector().query('SELECT 1 FROM %(table)s WHERE %(col_name)s = %(data)s LIMIT 1;', 
            {'col_name': field.label, 'data': field.data, 'table': self.table})
        if presence == 1:
            raise ValidationError(self.message)

class EmailForm(FlaskForm):
    title = "Enter Household Info"
    subtitle = "Please enter your email address:"
    email_input = StringField("email", validators=[email(),             
        DBPresenceCheck('Household', 'That email is already present in the database.')])
    # print(email_input.data)
    submit = SubmitField("Submit")

email-form.html

{% extends "base.html" %}
{% block content%}
 <div class="container py-4">
        <div class="p-5 mb-4 bg-light rounded-3">
            <h2 class="display-5 fw-bold">{{ template_form.title }}</h2>
            <p class="col-md-8 fs-4">{{ template_form.subtitle }}</p>
            <form action="{{ action }}" method="{{ method }}">
                <div id="main_elements">
                    {{ template_form['email_input']() }}
                </div>
                <div id="submit_element">
                    <br>
                    {{ template_form["submit"](class_="btn btn-primary") }}
                </div>
            </form>
        </div>
    </div>
{%endblock%}

我第一次意识到错误是在测试验证的时候,两个验证器都没有抛出。我在forms中添加了print语句,现在,当我使用flask run时,我得到了下面的错误。

Traceback (most recent call last):
  File "C:\Languages\Python\3.9\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Languages\Python\3.9\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\Scripts\flask.exe\__main__.py", line 7, in <module>
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\flask\cli.py", line 1047, in main
    cli.main()
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\click\core.py", line 1055, in main
    rv = self.invoke(ctx)
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\click\core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\click\core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\click\core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\click\decorators.py", line 84, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\click\core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\flask\cli.py", line 911, in run_command
    raise e from None
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\flask\cli.py", line 897, in run_command
    app = info.load_app()
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\flask\cli.py", line 312, in load_app
    app = locate_app(import_name, None, raise_if_not_found=False)
  File "C:\Users\askat\.virtualenvs\askat-YHGTcgZo\lib\site-packages\flask\cli.py", line 218, in locate_app
    __import__(module_name)
  File "C:\Users\askat\PycharmProjects\cs6400-2022-03-Team060\Phase_3\app.py", line 4, in <module>
    from forms import *
  File "C:\Users\askat\PycharmProjects\cs6400-2022-03-Team060\Phase_3\forms.py", line 33, in <module>
    class EmailForm(AddForm):
  File "C:\Users\askat\PycharmProjects\cs6400-2022-03-Team060\Phase_3\forms.py", line 37, in EmailForm
    print(email_input.data)
AttributeError: 'UnboundField' object has no attribute 'data'

如果print语句只是print(email_input),那么当我运行它时,将出现以下输出

<UnboundField(StringField, ('email',), {'validators': [<wtforms.validators.Email object at 0x0000024145A4F460>, <forms.DBPresenceCheck object at 0x0000024145A4F610>]})>

但是没有抛出错误。对我来说似乎很奇怪的是,错误甚至在字段创建之前就抛出了。

ippsafx7

ippsafx71#

在验证器列表中,你需要传入一个Email类的示例,所以你的字段应该是:

from wtforms.validators import Email

email_input = StringField("email", validators=[Email(), ...

并且不要忘记安装电子邮件包,因为Flask-WTF在其验证器中不再包含Email。

相关问题