在wtforms中调用验证时发生类型错误 [英] Type error on calling validate in wtforms

查看:66
本文介绍了在wtforms中调用验证时发生类型错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在表单上的"validate()"行中出现TypeError.

I have TypeError in line where I call 'validate()' on my form.

错误是:

   Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/valery/projects/easy_booking/easy_booking/controllers/users.py", line 110, in process_field
    if filled_form.validate():
  File "/usr/local/lib/python2.7/dist-packages/wtforms/form.py", line 265, in validate
    return super(Form, self).validate(extra)
  File "/usr/local/lib/python2.7/dist-packages/wtforms/form.py", line 130, in validate
    if not field.validate(self, extra):
  File "/usr/local/lib/python2.7/dist-packages/wtforms/fields/core.py", line 176, in validate
    stop_validation = self._run_validation_chain(form, chain)
  File "/usr/local/lib/python2.7/dist-packages/wtforms/fields/core.py", line 196, in _run_validation_chain
    validator(form, self)
TypeError: __init__() takes at most 2 arguments (3 given)

我的代码:

@app.route("/process_field", methods=['POST'])
def process_field():
    file = request.files['upload']
    filled_form = FieldFootball(request.form)
    if filled_form.validate():
        filename = secure_filename(file.filename)
        file.save(os.path.join(app.config['UPLOADS_FOLDER'], filename))
        doc = {"organization": filled_form.org_name.data, "address": filled_form.address.data,
               "filename": filename, "price": filled_form.price.data, "phone": filled_form.phone.data,
               "phone1": filled_form.phone1.data, "phone2": filled_form.phone2.data, "user_id": current_user.dic['_id']}
        field = Field(doc)
        field.save()
        return redirect(url_for('field_profile', id=field.id))
    else:
        return render_template("add_field.html", form=filled_form)

class FieldFootball(Form):
    org_name = TextField(u'Название организации', [validators.Required])
    address = TextAreaField(u'Полный адрес футбольного поля',[validators.Required])
    upload = FileField(u'Фотографии футбольного поля', validators=[
        FileRequired(),
        FileAllowed(['jpg', 'png'], u'Только фотографии!')
    ])
    price = TextField(u'Цена', [validators.Required, validators.NumberRange])
    phone = TextField(u'Телефоны', [validators.Required])
    phone1 = TextField(u'')
    phone2 = TextField(u'')
    my_choices = [('1', u'Трава'), ('2', u'Крытый'), ('3', u'Трибуны')]
    list_tags = MultiCheckboxField(choices = my_choices)

这有点奇怪,因为我在以前的控制器中使用了它,并且没有任何参数.

It is a bit weird because I used it in previous controller, and it goes without any argument.

请帮助我解决问题.

推荐答案

您需要实例化您的验证器:

org_name = TextField(u'Название организации', [validators.Required()])

注意Required之后的();这适用于您的所有验证器.然后再次调用该实例以验证输入.

Note the () after Required; this applies to all your validators. The instance is then called again to validate the input.

这篇关于在wtforms中调用验证时发生类型错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆