Changes

Version 2.3.1

Released 2020-04-22

  • All modules in wtforms.ext show a deprecation warning on import. They will be removed in version 3.0.

  • Fixed a bug when SelectField choices is None. #572, #585

  • Restored HTMLString and escape_html as aliases for MarkupSafe functions. Their use shows a DeprecationWarning. #581, #583

  • Form.validate takes an extra_validators parameter, mapping field names to lists of extra validator functions. This matches BaseForm.validate. #584

  • Update locale catalogs.

Version 2.3.0

Released 2020-04-21

  • Drop support for Python 2.6, 3.3, and 3.4.

  • SelectField uses list() to construct a new list of choices. #475

  • Permitted underscores in HostnameValidation. #463

  • URL validator now allows query parameters in the URL. #523, #524

  • Updated false_values param in BooleanField docs. #483, #485

  • Fixed broken format string in Arabic translation #471

  • Updated French and Japanese translations. #506, #514

  • Updated Ukrainian translation. #433

  • FieldList error list keeps entries in order for easier identification of which fields had errors. #257, #407

  • Length gives a more helpful error message when min and max are the same value. #266

  • SelectField no longer coerces None to "None" allowing use of "None" as an option. #289, #288

  • The TextArea widget prepends a \r\n newline when rendering to account for browsers stripping an initial line for display. This does not affect the value. #238, #395

  • HTML5 IntegerField and RangeInput don’t render the step="1" attribute by default. #343

  • aria_ args are rendered the same way as data_ args, by converting underscores to hyphens. aria_describedby="name-help" becomes aria-describedby="name-help". #239, #389

  • Added a check_validators method to Field which checks if the given validators are both callable, and not classes. #298, #410

  • form.errors is not cached and will update if an error is appended to a field after access. #568

  • NumberRange correctly handle NaN values. #505, #548

  • IntegerField checks input type when processing data. #451

  • Added a parameter to SelectField to skip choice validation. #434, #493

  • Choices which name and data are the same do not need to use tuples. #526

  • Added more documentation on HTML5 fields. #326, #409

  • HTML is escaped using MarkupSafe instead of the previous internal implementation. escape_html() is removed, replaced by markupsafe.escape(). HTMLString is removed, replaced by markupsafe.Markup. #400

  • Fixed broken IPv6 validator, validation now uses the ipaddress package. #385, #403

  • Label text is escaped before rendering. #315, #375

  • Email validation is now handled by an optional library, email_validator. #429

Version 2.2.1

Released 2018-06-07

  • StringField only sets data = '' when form data is empty and an initial value was not provided. This fixes an issue where the default value wasn’t rendered with the initial form. #291, #401, #355

Version 2.2

Released 2018-06-02

  • Merged new and updated translations from the community.

  • Passing data_ args to render a field converts all the underscores to hyphens when rendering the HTML attribute, not just the first one. data_foo_bar becomes data-foo-bar. #248

  • The UUID validator uses the uuid.UUID class instead of a regex. #251

  • SelectField copies the list of choices passed to it so modifying an instance’s choices will not modify the global form definition. #286

  • Fields call process_formdata() even if the raw data is empty. #280

  • Added a MultipleFileField to handle a multi-file input. FileField continues to handle only one value. The underlying FileInput widget gained a multiple argument. #281

  • SelectField choices can contain HTML (MarkupSafe Markup object or equivalent API) and will be rendered properly. #302

  • fields.TimeField and html5.TimeField were added. #254

  • Improved Email. Note that it is still unreasonable to validate all emails with a regex and you should prefer validating by actually sending an email. #294

  • Widgets render the required attribute when using a validator that provides the 'required' flag, such as DataRequired. #361

  • Fix a compatibility issue with SQLAlchemy 2.1 that caused QuerySelectField to fail with ValueError: too many values to unpack. #391

Version 2.1

Released 2015-12-15

  • Added render_kw to allow default rendering time options.

  • Updated / added a number of localizations.

  • Updated docs.

  • Allow widgets to set flags.

Version 2.0.2

Released 2015-01-18

  • Added more localizations and updated some.

  • Validators for email and URL can validate IDNA-encoded domain names and new TLDs.

  • Better DeprecationWarnings.

  • Support localization files in /usr/share/locale for distro packaging.

Version 2.0.1

Released 2014-07-01

  • Update wheel install to conditionally install ordereddict for Python 2.6.

  • Doc improvements.

Version 2.0

Released 2014-05-20

  • Add new class Meta paradigm for much more powerful customization of WTForms.

  • Move i18n into core. Deprecate wtforms.ext.i18n.

  • Move CSRF into core. Deprecate wtforms.ext.csrf.

  • Fix issue rendering SelectFields with value=True.

  • Make DecimalField able to use babel locale-based number formatting.

  • Drop Python 3.2 support (Python3 support for 3.3+ only).

  • Passing attr=False to WTForms widgets causes the value to be ignored.

  • Unique validator in wtforms.ext.sqlalchemy has been removed.

Version 1.0.5

Released 2013-09-10

  • Fix a bug in validators which causes translations to happen once then clobber any future translations.

  • ext.sqlalchemy and ext.appengine minor cleanups / deprecation.

  • Allow blank string and the string false to be considered false values for BooleanField (configurable). This is technically a breaking change, but it is not likely to affect the majority of users adversely.

  • ext.i18n form allows passing LANGUAGES to the constructor.

Version 1.0.4

Released 2013-04-28

  • Add widgets and field implementations for HTML5 specialty input types.

  • ext.appengine add NDB support.

  • Add translations for Korean, Traditional Chinese.

Version 1.0.3

Released 2013-01-24

  • Tests complete in python 3.2/3.3.

  • Localization for ru, fr.

  • Minor fixes in documentation for clarity.

  • FieldList now can take validators on the entire FieldList.

  • Fix issue with ext.sqlalchemy QuerySelectField.

  • Fix issue in ext.sqlalchemy ColumnDefault conversion.

  • ext.sqlalchemy supports Enum type.

  • Field class now allows traversal in Django 1.4 templates.

Version 1.0.2

Released 2012-08-24

  • We now support Python 2.x and 3.x on the same codebase, thanks to a lot of hard work by Vinay Sajip.

  • Add in ability to convert relationships to ext.sqlalchemy model_form.

  • Built-in localizations for more languages.

  • Distinguish Required validator into InputRequired and DataRequired.

  • Better IP address validation, including IPv6 support.

  • AnyOf / NoneOf now work properly formatting other datatypes than strings.

  • Optional validator can optionally pass through whitespace.

Version 1.0.1

Released 2012-02-29

  • Fixed issues related to building for Python 3 and Python pre-releases.

  • Add object_data to fields to get at the originally passed data.

Version 1.0

Released 2012-02-28

  • Output HTML5 compact syntax by default.

  • Substantial code reorg, cleanup, and test improvements.

  • Added ext.csrf for a way to implement CSRF protection.

  • ext.sqlalchemy supports PGInet, MACADDR, and UUID field conversion.

  • ext.sqlalchemy supports callable defaults.

  • ext.appengine model_form now supports generating forms with the same ordering as model.

  • ext.appengine ReferencePropertyField now gets get_label like the other ORM fields.

  • Add localization support for WTForms built-in messages.

  • Python 3 support (via 2to3).

  • An empty label string can be specified on fields if desired.

  • Option widget can now take kwargs customization.

  • Field subclasses can provide default validators as a class property.

  • DateTimeField can take time in microseconds.

  • Numeric fields all set .data to None on coercion error for consistency.

Version 0.6.3

Released 2011-04-24

  • Documentation: Substantial documentation improvements, including adding Crash Course as a Sphinx document.

  • ext.django QuerySetSelectField and ModelSelectField now accept get_label similar to sqlalchemy equivalents.

  • ext.appengine model_form fixes for FloatField, TimeField, and DateTimeField.

  • ext.appengine ReferencePropertyField now properly stores model object, not key.

Version 0.6.2

Released 2011-01-22

  • ext.appengine various field fixes.

  • ext.appengine model_form changes.

  • Fix issue in Optional with non-string input.

  • Make numeric fields more consistent.

  • Improve test coverage substantially.

Version 0.6.1

Released 2010-09-17

  • ext.appengine ReferencePropertyField.

  • Dateutil fields render issue, and consistency issue.

  • Optional validator failed when raw_data was absent

  • Documentation: docs now mention HTML escaping functionality.

  • Add preliminary support for providing a translations object that can translate built-in validation and coercion errors.

Version 0.6

Released 2010-04-25

  • HTML is now marked as safe (using __html__) so that compatible templating engines will not auto-escape it.

  • Field._default is now Field.default.

  • All fields now have a raw_data property.

  • Fields which are select fields (including those in .ext) can be iterated to produce options, and have an option_widget kwarg.

  • Minor bugfixes and cleanup in FieldList, Select(Multiple)Field, QuerySelectField to address behavioral consistency.

  • Added FloatField, based on IntegerField.

  • ext.appengine now supports FloatProperty and GeoPtProperty.

  • ext.sqlalchemy QueryMultipleSelectField changed to QuerySelectMultipleField.

Version 0.5

Released 2010-02-13

  • Added a BaseForm class which provides the core processing and validation functionality of Form without requiring declarative subclassing.

  • Field labels now default to a humanized field name.

  • Fields now have a short_name property which is the un-prefixed name.

  • DecimalField now rounds values for display without float coercion. See docs for details on how to format decimals.

  • ext.sqlalchemy.fields now has an additional QuerySelectMultipleField, and all fields can now support multiple-column primary keys.

  • ext.sqlalchemy.orm contains tools for making forms from ORM models.

  • Added ext.dateutil for flexible date-time parsing.

  • Added ext.appengine contributed by Rodrigo Moraes.

  • Added AnyOf and NoneOf validators.

Version 0.4

Released 2009-10-10

  • Fields have much greater control over input processing. Filters have been added to implement a simple way to transform input data.

  • Added fields that encapsulate advanced data structures such as dynamic lists or child forms for more powerful field composing.

  • Fields now use widgets for rendering.

  • All built-in validators have been converted to classes to clean up the code.

  • Form.auto_populate and Field.populate were renamed to populate_obj to clarify that they populate another object, not the Form or Field. This is an API breaking change.

  • Dropped support for Python 2.3.

Version 0.3.1

Released 2009-01-24

  • Several fixes were made to the code and tests to make WTForms compatible with Python 2.3/2.4.

  • Form’s properties can now be accessed via dictionary-style access such as form['author']. This also has the intended effect of making variable lookups in Django templates more reliable.

  • Form and Field construction changes: Form now uses a metaclass to handle creating its _unbound_fields property, and Field construction now gives an instance of the new UnboundField class instead of using a partial function application. These are both internal changes and do not change the API.

Version 0.3

Released 2009-01-18

  • Fields are now responsible for their own validation, instead of mostly relying on Form. There are also new pre_validate and post_validate hooks on subfields, adding a great deal of flexibility when dealing with field-level validation. Note that this is an API breaking change if you have any subfields that override Field.validate. These will need to be updated to use the new hooks.

  • process_data no longer accepts the has_formdata parameter.

  • At form instantiation time, process_data will be called only once for each field. If a model object is provided which contains the property, then this value is used. Otherwise, a keyword argument if specified is used. Failing that, the field’s default value is used.

  • If any form data is sent, process_formdata will be called after process_data for each field. If no form data is available for the given field, it is called with an empty list.

  • wtforms.ext.django has been overhauled, both to mirror features and changes of the Django 1.0 release, and to add some useful fields for working with Django ORM data in forms.

  • The checker keyword argument to SelectField, SelectMultipleField, and RadioField has been renamed to coerce to reflect the actual functionality of this callable.

Version 0.2

Released 2009-01-13

  • We have documentation and unit tests!

  • Fields now have a flags property which contain boolean flags that are set either by the field itself or validators being specified on a field. The flags can then be used in checks in template or Python code.

  • Changed the way fields take parameters, they are no longer quasi magic. This is a breaking change. Please see the documentation for the new syntax.

  • Added optional description argument to Field, accessible on the field as description. This provides an easy way to define e.g. help text in the same place as the form.

  • Added new semantics for validators which can stop the validation chain, with or without errors.

  • Added a regexp validator, and removed the not_empty validator in favour of two validators, optional and required. The new validators allow control over the validation chain in addition to checking emptiness.

  • Renamed wtforms.contrib to wtforms.ext and reorganised wtforms.ext.django. This is a breaking change if you were using the Django extensions, but should only require changing your imports around a little.

  • Better support for other frameworks such as Pylons.

Version 0.1

Released 2008-07-25

  • Initial release.