Flask-WTForms throws error for IntegerField instead of failing validation

18,908

Solution 1

The error below means that you are trying to check the length of an integer which is not allowed by python. If you want to check length, then it must be a string. IntegerField() however by definition is an integer

object of type 'int' has no len()

You need to create something like below. NumberRange takes a range of numbers.

IntegerField('Telephone', [validators.NumberRange(min=0, max=10)])

Alternatively,I suggest you use a FormField and define your own telephone field. There is an exact example here to create a telephone field:

http://wtforms.simplecodes.com/docs/0.6.1/fields.html#wtforms.fields.FormField

Solution 2

From the http://wtforms.readthedocs.org/en/latest/validators.html#wtforms.validators.Length

"Validates the length of a string."

Also i dont think it is a good idea to store/validate telephone numbers as integers. You should probably use wtforms.validators.Regexp to validate the number.

Share:
18,908
Sixhobbits
Author by

Sixhobbits

Updated on July 28, 2022

Comments

  • Sixhobbits
    Sixhobbits almost 2 years

    When I create a form using wtf_forms and Flask-WTF and use the IntegerField input, I can't use it in combination with the Length validator

    If I remove the Length restriction then it works fine. Surely I should be able to apply a Length validation to an IntegerField?

    Python Code.

    from flask_wtf import Form
    from wtforms import TextField, PasswordField, IntegerField, validators
    
    class RegistrationForm(Form):
        firstname = TextField('First Name', [validators.Required()])
        lastname = TextField('Last Name', [validators.Required()])
        telephone = IntegerField('Telephone', [validators.Length(min=10, max=10, message="Telephone should be 10 digits (no spaces)")])
    
    TypeError
    TypeError: object of type 'int' has no len()
    
    Traceback (most recent call last)
    File "C:\Python27\lib\site-packages\flask\app.py", line 1701, in __call__
    return self.wsgi_app(environ, start_response)
    File "C:\Python27\lib\site-packages\flask\app.py", line 1689, in wsgi_app
    response = self.make_response(self.handle_exception(e))
    File "C:\Python27\lib\site-packages\flask\app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
    File "C:\Python27\lib\site-packages\flask\app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
    File "C:\Python27\lib\site-packages\flask\app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
    File "C:\Python27\lib\site-packages\flask\app.py", line 1344, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
    File "C:\index.py", line 45, in submit
    if form.validate_on_submit():
    File "C:\Python27\lib\site-packages\flask_wtf\form.py", line 156, in validate_on_submit
    return self.is_submitted() and self.validate()
    File "C:\Python27\lib\site-packages\wtforms\form.py", line 271, in validate
    return super(Form, self).validate(extra)
    File "C:\Python27\lib\site-packages\wtforms\form.py", line 130, in validate
    if not field.validate(self, extra):
    File "C:\Python27\lib\site-packages\wtforms\fields\core.py", line 175, in validate
    stop_validation = self._run_validation_chain(form, chain)
    File "C:\Python27\lib\site-packages\wtforms\fields\core.py", line 195, in _run_validation_chain
    validator(form, self)
    File "C:\Python27\lib\site-packages\wtforms\validators.py", line 91, in __call__
    l = field.data and len(field.data) or 0
    TypeError: object of type 'long' has no len()