NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1131 most downloaded on PyPI
Form validation and rendering for Python web development.
Last release 3 months ago
15 Jun 2026
Release timing varies
gaps range from 3 weeks to 1.8 years
Nearly every release is documented
notes for 30 of 30 stable releases
Nothing withdrawn
no release was ever pulled
17 years old
34 releases · first in 2009
Full Changelog : 3.3.0b3...3.3.0b3
Full Changelog: 3.3.0b3...3.3.0b3
Released 2026-06-12
Add fields.enum_choices, fields.enum_coerce and ~wtforms.datalist.enum_datalist for Enum-backed choices, replacing SelectChoice.from_enum and friends. 922
An Enum coerce is no longer wrapped, and options default to member.value. 922
Full Changelog : 3.3.0b2...3.3.0b2
Full Changelog: 3.3.0b2...3.3.0b2
One column per quarter.
Released 2026-05-24
~fields.SelectField choices accepts a shorthand dict syntax: {value: label} for flat options and {label: {value: label}} for optgroups. 886
Split choice types by role: ~fields.SelectChoice and ~fields.DataListChoice to declare options via choices=, ~fields.Choice for what iter_choices / iter_groups yield. 922
choices callables on ~fields.SelectField and ~datalist.DataList may accept (form, field). Resolved once per processing cycle. 922
Add fields.Field.post_process and form.BaseForm.post_process hooks, propagated through ~fields.FormField and ~fields.FieldList for cross-field finalization. 922
Add Field._form and BaseForm._parent_form so fields and nested forms can reach their enclosing form. Fix ~fields.FieldList entries and ~fields.SelectField option subfields which previously got form=None. 922
Restore 3.2 compatibility for ~fields.SelectField subclasses: tuple yields from ~fields.SelectFieldBase.iter_choices / ~fields.SelectFieldBase.iter_groups, 3-positional widgets.Select.render_option overrides, ~fields.SelectFieldBase.has_groups / ~fields.SelectFieldBase.iter_groups, and self.choices keeping the user-supplied shape. Each emits a DeprecationWarning; will be removed in WTForms 4.0. 922
Deprecate DateTimeField by @azmeuk in #897
python-dateutil dependency by @mgorny in #899test_environment support for the Email validator by @azmeuk in #894html_params returns Markup by @azmeuk in #907DateTimeLocalField by @azmeuk in #905sorted(set()) instead of list(dict.fromkeys()) to sort keys in FieldList by @azmeuk in #920Full Changelog: 3.2.2...3.3.0b1
Released 2026-05-10
Add ~validators.DateRange. min and max may be callables to compute dynamic bounds; ~validators.NumberRange accepts callables on the same terms. 787
Make ~fields.FloatField render as <input type="number"> with step="any". 677 679
~fields.FieldList._add_entry now routes through ~meta.DefaultMeta.bind_field, consistent with how the form constructor binds top-level fields. Custom Meta.bind_field overrides were silently bypassed for all FieldList entries. 891
Add test_environment support to ~validators.Email. 869 894
Reset ~fields.FieldList index state when reprocessing entries. 874 895
Let ~widgets.RangeInput accept min and max at construction time. 693 898
Do not render a for attribute on the main label of ~fields.RadioField. 775 900
Deprecate ~fields.DateTimeField, which will be removed in WTForms 3.4. 831 897
Clarify that ~fields.SelectField choices is re-evaluated at every form instantiation, including callables, in the documentation. 875 909
Render False as value="False" in ~fields.SelectField options instead of omitting the attribute. 878 908
Accept uuid.UUID instances in the ~validators.UUID validator, and translate unexpected types into ~validators.ValidationError instead of letting TypeError escape. 549 769
Escape double quotes in ~markupsafe.Markup attribute values passed to ~widgets.html_params, and return a ~markupsafe.Markup. 801 906 907
Clarify documentation about filters. 859 896
Let render-time checked kwargs take precedence over the field's value in ~widgets.CheckboxInput and ~widgets.RadioInput. 706 910
Add a tz parameter to ~fields.DateTimeLocalField to associate a timezone with the input. 833 905
Add ~fields.FieldList insert_entry and indexed pop_entry. 256 901 912
Add ~fields.ButtonField to render <button type="submit"> controls with string values. 784 892
~fields.SelectField refactor. Choices tuples and dicts are deprecated in favor of ~fields.Choice. 739 889
<option> HTML attributes can be passed using ~fields.Choice. 692 739 889
Add fields.Choice.from_enum to build choices from an enum.Enum class, and let ~fields.SelectField accept an Enum class as coerce. 338 916
Defer to email_validator's module-level defaults for the ~validators.Email test_environment, allow_smtputf8 and allow_empty_local options. 915 917
Add invalid_value_message and invalid_choice_message keyword arguments for customizing built-in field error messages. On SelectMultipleField, invalid_choice_message may also be a callable for custom pluralization. 39 832 902
~fields.SelectField and ~fields.SelectMultipleField pre_validate now short-circuits when process_formdata already produced an error, so a single coercion failure no longer surfaces as both an "invalid value" and an "invalid choice" error. 902
Add a matcher keyword argument to ~validators.Regexp to override the matching function. Defaults to re.match; pass re.search or re.fullmatch to change the anchoring behaviour. 867 918
Add an html_pattern keyword argument to ~validators.Regexp to control the HTML pattern attribute emitted on supporting widgets. 759
~validators.URL validator is based on urllib.parse.urlparse instead of a regex. New keyword arguments: allow_userinfo for accepting user:password@host URLs; schemes (default ("http", "https")) is the allowlist of accepted schemes 847
Add native DataList support. 653 921
remove slsa provenance by @davidism in #879
Full Changelog: 3.2.1...3.2.2
Released 2026-05-03
Fix ~validators.Disabled validation with provided formdata. 880
End support for Python 3.9, start support for Python 3.14. 883
Add Tamil and Serbian translations.
Fix SelectMultipleBase import. #861 #862
Warning Some deprecated code was removed ( #859 ):
Released 2024-10-20
required flag support from HiddenWidget,RangeWidget and SelectWidget toNoneOf and AnyOfSelectMultipleFieldWarning
Some deprecated code was removed (#859):
Note
If you need to keep the old behavior you can set the _form_error_key parameter of your form to :data:None.
Released 2024-10-20
Translations update: korean, chinese (traditional), portugese, russian, dutch, kazakh, swedish, turkish, slovak, ukranian, spanish, french.
Move the repository to the pallets-eco organization. 854
Stop supporting Python 3.9 and start supporting Python 3.13 855
Removed required flag support from ~fields.HiddenWidget, ~fields.RangeWidget and ~fields.SelectWidget to conform to W3C 810
~wtforms.validators.NoneOf and ~wtforms.validators.AnyOf can validate multiple valued fields like ~fields.SelectMultipleField 538 807
Use GHA and pre-commit workflows inspired from Flask. 856 860
⚠️Breaking change⚠️: Some deprecated code was removed (859):
~wtforms.Flags can no longer be tuples. 467
iter_choices needs a tuple of 4 items 816
⚠️Breaking change⚠️: The key for form errors moved from None to empty string "". 829 858
Note
If you need to keep the old behavior you can set the _form_error_key parameter of your form to None.
Fix SelectMultipleField value coercion on validation. #822 #823
Released 2024-01-06
Fix ~fields.SelectMultipleField value coercion on validation. 822 823
Display Flags values in their repr. #808
Released 2023-11-01
Released 2023-11-01
Display ~wtforms.Flags values in their repr. 808
~fields.SelectField and ~fields.SelectMultipleField choices can be None if validate_choice is False 809
Documentation improvements 812 815 817
Unit tests improvements 813
Python 3.12 support 818
Restored support for 3-items tuple return value from iter_choices 816
Documentation improvements #726 #733 #749 #767 #788 #789 #793
Released 2023-10-10
~fields.ColorField #755email_validator. #727<option> attributes can be passed by the :class:~fields.SelectFieldchoices parameter #692 #738~fields.DateTimeLocalField #761~fields.DateTimeLocalField~fields.WeekFieldallow_ip parameter #800~validators.ReadOnly and~validators.Disabled #788Released 2023-10-10
Documentation improvements 726 733 749 767 788 789 793
Translation improvements 732 734 754
Implement ~fields.ColorField 755
Delayed import of email_validator. 727
<option> attributes can be passed by the ~fields.SelectField choices parameter 692 739. ⚠️breaking change⚠️: iter_choices now returns a tuple of 4 items
Use the standard datetime formats by default for ~fields.DateTimeLocalField 761
Python 3.11 support 763
Added shorter format to ~fields.DateTimeLocalField defaults 761
Stop support for python 3.7 794
Added shorter format to ~fields.WeekField defaults 765
Move to pyproject.toml 796
URL validator takes a allow_ip parameter 800
Implement ~validators.ReadOnly and ~validators.Disabled `788
Released 2023-10-10
Documentation improvements #726 #733 #749 #767 #788 #789 #793
Translation improvements #732 #734 #754
Implement ColorField #755
Delayed import of email_validator . #727
<option> attributes can be passed by the SelectField choices parameter #692 #739 . ⚠️breaking change⚠️: iter_choices now returns a tuple of 4 items
Use the standard datetime formats by default for DateTimeLocalField #761
Python 3.11 support #763
Added shorter format to DateTimeLocalField defaults #761
Stop support for python 3.7 #794
Added shorter format to WeekField defaults #765
Move to pyproject.toml #796
URL validator takes a allow_ip parameter #800
Implement ReadOnly and Disabled :pr:`788
Fixed DateTimeField and other similar fields can handle multiple formats. #720 #721
Released 2021-12-23
DateTimeField and other similar fields can handle multiple formats. #720 #721Released 2021-12-23
Fixed ~fields.DateTimeField and other similar fields can handle multiple formats. 720 721
Stop support for python 3.6 722
Fixed fields.RadioField validators. #477 #615
Released 2021-11-07
fields.RadioField validators. #477 #615fields.FormField.populate_obj always calls setattr #675fields.RadioField render_kw rendering. #490 #628 #688fields.SelectField and fields.SelectMultipleField. #656 #667fields.FieldList. #681 #694fields.DateTimeField, fields.DateField and fields.TimeField support time formats that removes leading zeros. #703fields/core.py and fields/simple.py #710Released 2021-11-07
Fixed RadioField validators. #477 #615
populate_obj() always calls setattr() #675
WTForms has a new logo. #569 #689
Fixed RadioField render_kw rendering. #490 #628 #688
Support for optgroups in SelectField and SelectMultipleField . #656 #667
Minor documentation fix. #701
Custom separators for FieldList . #681 #694
DateTimeField , DateField and TimeField support time formats that removes leading zeros. #703
Refactoring: split fields/core.py and fields/simple.py #710
Drop support for Python < 3.6. #554
fields.StringField sets data to None when form data is empty and an initial value was not provided. Although it previously set an empty string, None is consistent with the behavior of other fields. #355ValueError raised by a validator are handled like regular exceptions. Validators need to raise validators.ValidationError or validators.StopValidation to make a validation fail. #445fields.SelectField, fields.SelectMultipleField and fields.RadioField choices parameter can be a callable. #608fields.core.SelectMultipleField. #603 #605fields.core.MonthField. #530 #593form.BaseForm.process takes a extra_filters parameter. #128 #592fields.core.SelectField choices are list of strings. #598fields.core.SelectMultipleField validate_choice bugfix. #606 #642Released 2020-11-23
Drop support for Python < 3.6. 554
~fields.StringField sets data to None when form data is empty and an initial value was not provided. Although it previously set an empty string, None is consistent with the behavior of other fields. 355
Specified version of Babel required for setup to avoid errors. 430
Replaced use of getattr/setattr with regular variable access. 482
ValueError raised by a validator are handled like regular exceptions. Validators need to raise ~validators.ValidationError or ~validators.StopValidation to make a validation fail. 445
~fields.SelectField, ~fields.SelectMultipleField and ~fields.RadioField choices parameter can be a callable. 608
Choices shortcut for ~fields.core.SelectMultipleField. 603 605
Forms can have form-level errors. 55 595
Implemented ~wtforms.fields.core.MonthField. 530 593
Filters can be inline. form.BaseForm.process takes a extra_filters parameter. 128 592
Fields can be passed the name argument to use a HTML name different than their Python name. 205, 601
Render attribute names like for_ and class_ are normalized consistently so later values override those specified earlier. 449, 596
Flags should now be stored in dicts and can take non-boolean values. A DeprecationWarning is issued when tuples are used. 406 467
Widgets are HTML5 by default. 594 614
Fixed a bug when the ~wtforms.fields.core.SelectField choices are list of strings. 598
Error messages standardization. 613 620 626 627
~wtforms.fields.core.SelectMultipleField validate_choice bugfix. 606 642
Fixed SelectMultipleField validation when using choices list shortcut. 612 661
Removed form._get_translations. Use Meta.get_translations instead.
Released 2020-11-23
Drop support for Python < 3.6. #554
StringField sets data to None when form data is empty and an initial value was not provided. Although it previously set an empty string, None is consistent with the behavior of other fields. #355
Specified version of Babel required for setup to avoid errors. #430
Replaced use of getattr / setattr with regular variable access. #482
ValueError raised by a validator are handled like regular exceptions. Validators need to raise ValidationError or StopValidation to make a validation fail. #445
SelectField , SelectMultipleField and RadioField choices parameter can be a callable. #608
Choices shortcut for SelectMultipleField . #603 #605
Forms can have form-level errors. #55 #595
Implemented MonthField . #530 #593
Filters can be inline. form.BaseForm.process() takes a extra_filters parameter. #128 #592
Fields can be passed the name argument to use a HTML name different than their Python name. #205 , #601
Render attribute names like for_ and class_ are normalized consistently so later values override those specified earlier. #449 , #596
Flags should now be stored in dicts and can take non-boolean values. A DeprecationWarning is issued when tuples are used. #406 #467
Widgets are HTML5 by default. #594 #614
Fixed a bug when the SelectField choices are list of strings. #598
Error messages standardization. #613 #620 #626 #627
SelectMultipleField validate_choice bugfix. #606 #642
Fixed SelectMultipleField validation when using choices list shortcut. #612 #661
Removed form._get_translations() . Use Meta.get_translations instead.
Includes the translation files that were missing in the 2.3.2 release.
Includes the translation files that were missing in the 2.3.2 release.
Released 2020-07-30
This release includes the translation files that were missing in the 2.3.2 release. 641
Fixed a bug with ~fields.SelectField choices shortcut at form submission. #598 #639
[Changelog](https://wtforms.readthedocs.io/en/2.3.x/changes/#version-2-3-2):
Fixed a bug with ~fields.SelectField choices shortcut at form submission. #598 #639
Released 2020-07-29
Fixed a bug with ~fields.SelectField choices shortcut at form submission. 598, 639
Released 2020-07-29
Fixed a bug with SelectField choices shortcut at form submission. #598 , #639
Changes: https://wtforms.readthedocs.io/en/2.3.x/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 ~fields.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.
Changes: https://wtforms.readthedocs.io/en/2.3.x/changes/#version-2-3-0
It's been a while! Thanks to the new maintainers who helped get the new release ready.
2.3.x will be the last version to support Python 2. Version 3.0 will support Python >= 3.6.
Released 2020-04-21
Drop support for Python 2.6, 3.3, and 3.4.
~fields.SelectField uses list() to construct a new list of choices. 475
Permitted underscores in HostnameValidation. 463
~validators.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
~validators.Length gives a more helpful error message when min and max are the same value. 266
~fields.SelectField no longer coerces None to "None" allowing use of "None" as an option. 289, 288
The ~widgets.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 ~fields.html5.IntegerField and ~fields.html5.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 ~fields.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
~wtforms.validators.NumberRange correctly handle NaN values. 505, 548
~fields.IntegerField checks input type when processing data. 451
Added a parameter to ~fields.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. ~widgets.core.escape_html is removed, replaced by markupsafe.escape. ~widgets.core.HTMLString is removed, replaced by markupsafe.Markup. 400
Fixed broken IPv6 validator, validation now uses the ipaddress package. 385, 403
~fields.core.Label text is escaped before rendering. 315, 375
Email validation is now handled by an optional library, email_validator. 429
~fields.StringField only sets data = '' when form data is empty and an initial value was not provided. This fixes an issue where the default value was
Released 2018-06-07
~fields.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
Merged new and updated translations from the community.
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 ~validators.UUID validator uses the uuid.UUID class instead of a regex. 251
~fields.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 ~fields.Field.process_formdata even if the raw data is empty. 280
Added a ~fields.MultipleFileField to handle a multi-file input. ~fields.FileField continues to handle only one value. The underlying ~widgets.FileInput widget gained a multiple argument. 281
~fields.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 ~validators.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 ~validators.DataRequired. 361
Fix a compatibility issue with SQLAlchemy 1.2 that caused ~ext.sqlalchemy.fields.QuerySelectField to fail with ValueError: too many values to unpack. 391
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
Added render_kw to allow default rendering time options.
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.
Added more localizations and updated some.
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.
Update wheel install to conditionally install ordereddict for Python 2.6.
Released 2014-07-01
Update wheel install to conditionally install ordereddict for Python 2.6.
Doc improvements.
Move i18n into core. Deprecate wtforms.ext.i18n.
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.
Deprecate form._get_translations. Use Meta.get_translations instead.
Allow blank string and the string false to be considered false values for BooleanField (configurable). This is technically a breaking change, but it i…
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.
Add widgets and field implementations for HTML5 specialty input types.
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.
Tests complete in python 3.2/3.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.
We now support Python 2.x and 3.x on the same codebase, thanks to a lot of hard work by Vinay Sajip.
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.
Fixed issues related to building for Python 3 and Python pre-releases.
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.
Output HTML5 compact syntax by default.
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.
Documentation: Substantial documentation improvements, including adding Crash Course as a Sphinx document.
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.
ext.appengine various field fixes.
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.
ext.appengine ReferencePropertyField.
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.
HTML is now marked as safe (using __html__) so that compatible templating engines will not auto-escape it.
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.
Added a BaseForm class which provides the core processing and validation functionality of Form without requiring declarative subclassing.
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.
…object, not the Form or Field. This is an API breaking change.
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.
Your coding agent can read these notes before it upgrades. Set up the MCP server →