Skip to main content

Create wtforms from Jinja templates

Project description

Jinja-WTForms

Extract WTForms classes from jinja templates

Installation

pip install jinja-wtforms

Setup

from jinja2 import Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('templates'))
env.add_extension('jinja_wtforms.WtformExtension')

Defining forms in templates

Defining forms is almost like using a pre-defined form but with added information on the type of the field.

To do so, you'll need to call a method named after the type of the field on each field. So if you want to define a "firstname" field as a text field, you can do form.firstname.text().

Let's define a signup form:

<form action="" method="post">
    {{ form.hidden_tags() }}
    <p><label>First name</label> {{ form.firstname.text() }}</p>
    <p><label>Last name</label> {{ form.lastname.text() }}</p>
    <p><label>Email</label> {{ form.email.email() }}</p>
    <p><label>Password</label> {{ form.password.password() }}</p>
</form>

The optional parameters of the field definition functions are:

  • label: the field's label (can also be define as the first argument)
  • description: the field's description
  • placeholder: the field's placeholder
  • required: boolean, default false
  • optional: boolean, default false
  • range: a tuple of (min, max), value should be a number in the range
  • length: a tuple of (min, max), value should be of string of length in the range
  • validators: a list of validator names from wtforms.validators

Available field types and their actual class:

  • checkbox: wtforms.fields.BooleanField
  • decimal: wtforms.fields.DecimalField
  • date: wtforms.fields.DateField
  • datetime: wtforms.fields.DateTimeField
  • float: wtforms.fields.FloatField
  • int: wtforms.fields.IntegerField
  • radio: wtforms.fields.RadioField
  • select: wtforms.fields.SelectField
  • selectmulti: wtforms.fields.SelectMultipleField
  • text: wtforms.fields.StringField
  • textarea: wtforms.fields.TextAreaField
  • password: wtforms.fields.PasswordField
  • upload: wtforms.fields.FileField
  • hidden: wtforms.fields.HiddenField
  • datetimelocal: wtforms.fields.DateTimeLocalField
  • decimalrange: wtforms.fields.DecimalRangeField
  • email: wtforms.fields.EmailField
  • intrange: wtforms.fields.IntegerRangeField
  • search: wtforms.fields.SearchField
  • tel: wtforms.fields.TelField
  • url: wtforms.fields.URLField

Extracting forms

Use the form registry available through the forms property of the environment:

form_class = env.forms["form.html"].form # where form.html is the template filename containing the form definition
form = form_class()

# can also be directly instantiated
form = env.forms["form.html"]()

Form classes are extracted on first call to a env.forms. You can pre-register all forms using env.forms.register_all()

The form directive

The form directive can be used before any usage of the form object. It will ensure that a form object exists. It can also be used to define the class name.

As a way to ensure a form object is always available:

{% form %}
<form action="" method="post">
    <p><label>First name</label> {{ form.firstname.text() }}</p>
</form>

To customize the class name:

{% form MyForm %}
<form action="" method="post">
    <p><label>First name</label> {{ form.firstname.text() }}</p>
</form>

Class name with optional Meta property:

{% form MyForm(csrf=True) %}
<form action="" method="post">
    {{form.hidden_tags()}}
    <p><label>First name</label> {{ form.firstname.text() }}</p>
</form>

To customize the form object variable name:

{% form = f %}
<form action="" method="post">
    <p><label>First name</label> {{ f.firstname.text() }}</p>
</form>

With custom class name:

{% form MyForm = f %}
<form action="" method="post">
    <p><label>First name</label> {{ f.firstname.text() }}</p>
</form>

You can disable auto instantiation of a form object when non is present by using auto_init=False as a Meta param.

Multiple forms in a single template

Use multiple form directives to declare mutliple forms with different form object names.

{% form %}
{% form = form2 %}
<form action="" method="post">
    <p><label>First name</label> {{ form.firstname.text() }}</p>
</form>
<form action="" method="post">
    <p><label>First name</label> {{ form2.email.email() }}</p>
</form>

Then access them from the registry:

form_class = env.forms["form.html"].form
form2_class = env.forms["form.html"].form2

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jinja_wtforms-0.2.1.tar.gz (5.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jinja_wtforms-0.2.1-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

Details for the file jinja_wtforms-0.2.1.tar.gz.

File metadata

  • Download URL: jinja_wtforms-0.2.1.tar.gz
  • Upload date:
  • Size: 5.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.0

File hashes

Hashes for jinja_wtforms-0.2.1.tar.gz
Algorithm Hash digest
SHA256 17458783c0dd7bcd947e34ccbebfee21cd58575a65dcb564076d222eb32cda14
MD5 90f12db4ace394dcb6dbd25584a3922e
BLAKE2b-256 a1b0552747b3b49ebeaf14ca8202ea0b95566a8de93c1191c02e581c8e829a16

See more details on using hashes here.

File details

Details for the file jinja_wtforms-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for jinja_wtforms-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 758391041f6e27d72d99e265a0f2317f9e34affb92ebef5391122e37bb6adcaf
MD5 e5ae1bda32ac30e701689c5408636a45
BLAKE2b-256 2d8d546d764283d3ab1c58e5e5c4755c0b6e7c4dc9074e1f67cba842c4489902

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page