# wtforms

> Form validation and rendering for Python web development.

- **URL**: https://www.freshcrate.ai/projects/wtforms
- **Author**: WTForms
- **Category**: Frameworks
- **Latest version**: `3.2.2` (2026-05-03)
- **License**: non-standard
- **Source**: https://github.com/pallets-eco/wtforms/issues
- **Homepage**: https://pypi.org/project/WTForms/
- **Language**: Python
- **GitHub**: 1,573 stars, 403 forks
- **Registry**: pypi (`wtforms`)
- **Tags**: `pypi`

## Description

WTForms
=======

WTForms is a flexible forms validation and rendering library for Python
web development. It can work with whatever web framework and template
engine you choose. It supports data validation, CSRF protection,
internationalization (I18N), and more. There are various community
libraries that provide closer integration with popular frameworks.


Installation
------------

Install and update using pip:

.. code-block:: text

    pip install -U WTForms


Third-Party Library Integrations
--------------------------------

WTForms is designed to work with any web framework and template engine.
There are a number of community-provided libraries that make integrating
with frameworks even better.

-   `Flask-WTF`_ integrates with the Flask framework. It can
    automatically load data from the request, uses Flask-Babel to
    translate based on user-selected locale, provides full-application
    CSRF, and more.
-   `WTForms-Alchemy`_ provides rich support for generating forms from
    SQLAlchemy models, including an expanded set of fields and
    validators.
-   `WTForms-SQLAlchemy`_ provides ORM-backed fields and form generation
    from SQLAlchemy models.
-   `WTForms-AppEngine`_ provides ORM-backed fields and form generation
    from AppEnding db/ndb schema
-   `WTForms-Django`_ provides ORM-backed fields and form generation
    from Django models, as well as integration with Django's I18N
    support.
-   `WTForms-Bootstrap5`_ provides Bootstrap 5 favor renderer with
    great customizability.
-   `Starlette-WTF`_ integrates with Starlette and the FastAPI
    framework, based on the features of Flask-WTF.
-   `Bootstrap-Flask`_ Bootstrap-Flask is a collection of Jinja macros
    for Bootstrap 4 & 5 and Flask using Flask-WTF.

.. _Flask-WTF: https://flask-wtf.readthedocs.io/
.. _WTForms-Alchemy: https://wtforms-alchemy.readthedocs.io/
.. _WTForms-SQLAlchemy: https://github.com/pallets-eco/wtforms-sqlalchemy
.. _WTForms-AppEngine: https://github.com/pallets-eco/wtforms-appengine
.. _WTForms-Django: https://github.com/pallets-eco/wtforms-django
.. _WTForms-Bootstrap5: https://github.com/LaunchPlatform/wtforms-bootstrap5
.. _Starlette-WTF: https://github.com/muicss/starlette-wtf
.. _Bootstrap-Flask: https://github.com/helloflask/bootstrap-flask


Links
-----

-   Documentation: https://wtforms.readthedocs.io/
-   Releases: https://pypi.org/project/WTForms/
-   Code: https://github.com/pallets-eco/wtforms
-   Issue tracker: https://github.com/pallets-eco/wtforms/issues
-   Discord Chat: https://discord.gg/F65P7Z9
-   Translation: https://hosted.weblate.org/projects/wtforms/wtforms/

## Recent releases

| Version | Date | Urgency | Changes |
| --- | --- | --- | --- |
| `3.2.2` | 2026-05-03 | High | ## What's Changed * remove slsa provenance by @davidism in https://github.com/pallets-eco/wtforms/pull/879 * fix(validators): Disabled validation with provided formdata by @subnix in https://github.com/pallets-eco/wtforms/pull/880 * Support Python versions from 3.10 to 3.14 by @azmeuk in https://github.com/pallets-eco/wtforms/pull/883 * Update FAQ to reflect 3.10+ support by @kurtmckee in https://github.com/pallets-eco/wtforms/pull/884 * GHA improvements by @azmeuk in https://github.com/pal |
| `3.2.1` | 2026-04-21 | Low | Imported from PyPI (3.2.1) |
| `3.2.0` | 2024-10-20 | Low | 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 ``HiddenWidget``,   ``RangeWidget`` and ``SelectWidget`` to   conform to W3C #810 - ``NoneOf`` and ``AnyOf``   can validate multiple valued fields like ``Selec |
| `3.1.2` | 2024-01-06 | Low | Released 2024-01-06  - Fix SelectMultipleField value coercion on validation.   #822 #823 |
| `3.1.1` | 2023-11-01 | Low | Released 2023-11-01  - Display `Flags` values in their repr. #808 - `~SelectField` and `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 |
| `3.1.0` | 2023-10-10 | Low | Released 2023-10-10  -   Documentation improvements #726 #733 #749     #767 #788 #789 #793 -   Translation improvements #732 #734 #754 -   Implement :class:`~fields.ColorField` #755 -   Delayed import of ``email_validator``. #727 -   ``<option>`` attributes can be passed by the :class:`~fields.SelectField`     ``choices`` parameter #692 #738 -   Use the standard datetime formats by default for     :class:`~fields.DateTimeLocalField`  #761 -   Python 3.11 support #763 -   Added shorte |
| `3.0.1` | 2021-12-23 | Low | Released 2021-12-23  -   Fixed `DateTimeField` and other similar fields can handle multiple formats. #720 #721 -   Stop support for python 3.6 #722 |
| `3.0.0` | 2021-11-07 | Low | Released 2021-11-07  -   Fixed `fields.RadioField` validators. #477 #615 -   `fields.FormField.populate_obj` always calls `setattr` #675 -   WTForms has a new logo. #569 #689 -   Fixed `fields.RadioField` `render_kw` rendering. #490 #628 #688 -   Support for optgroups in `fields.SelectField` and `fields.SelectMultipleField`. #656 #667 -   Minor documentation fix. #701 -   Custom separators for `fields.FieldList`. #681 #694 -   `fields.DateTimeField`, `fields.DateField` and `fields.TimeF |
| `3.0.0a1` | 2020-11-23 | Low | - 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.V |
| `2.3.3` | 2020-07-30 | Low | Includes the translation files that were missing in the 2.3.2 release. |

## Citation

- HTML: https://www.freshcrate.ai/projects/wtforms
- Markdown: https://www.freshcrate.ai/projects/wtforms.md
- Dependencies JSON: https://www.freshcrate.ai/api/projects/wtforms/deps

_Generated by freshcrate.ai. Indexes pypi releases for AI-agent ecosystem packages._
