Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Type error on calling validate in wtforms

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

The error is:

   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)

My code:

@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.

Please help me solve it.

like image 231
Slow Harry Avatar asked Sep 15 '13 12:09

Slow Harry


1 Answers

You need to instantiate your validators:

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

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

like image 186
Martijn Pieters Avatar answered Sep 21 '22 15:09

Martijn Pieters