From 82511a6fe2d29d50c1cdca4b2abb23ff681a1943 Mon Sep 17 00:00:00 2001 From: Sebastian Silva Date: Wed, 16 Nov 2011 07:56:19 +0000 Subject: Major improvements in IDE usability. --- (limited to 'app/static/doc/flask-docs/patterns/wtforms.html') diff --git a/app/static/doc/flask-docs/patterns/wtforms.html b/app/static/doc/flask-docs/patterns/wtforms.html new file mode 100644 index 0000000..f998f2e --- /dev/null +++ b/app/static/doc/flask-docs/patterns/wtforms.html @@ -0,0 +1,224 @@ + + + + + + + + + Form Validation with WTForms — Flask 0.8 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Form Validation with WTForms

+

When you have to work with form data submitted by a browser view code +quickly becomes very hard to read. There are libraries out there designed +to make this process easier to manage. One of them is WTForms which we +will handle here. If you find yourself in the situation of having many +forms, you might want to give it a try.

+

When you are working with WTForms you have to define your forms as classes +first. I recommend breaking up the application into multiple modules +(Larger Applications) for that and adding a separate module for the +forms.

+
+

Getting most of WTForms with an Extension

+

The Flask-WTF extension expands on this pattern and adds a few +handful little helpers that make working with forms and Flask more +fun. You can get it from PyPI.

+
+
+

The Forms

+

This is an example form for a typical registration page:

+
from wtforms import Form, BooleanField, TextField, validators
+
+class RegistrationForm(Form):
+    username = TextField('Username', [validators.Length(min=4, max=25)])
+    email = TextField('Email Address', [validators.Length(min=6, max=35)])
+    password = PasswordField('New Password', [
+        validators.Required(),
+        validators.EqualTo('confirm', message='Passwords must match')
+    ])
+    confirm = PasswordField('Repeat Password')
+    accept_tos = BooleanField('I accept the TOS', [validators.Required()])
+
+
+
+
+

In the View

+

In the view function, the usage of this form looks like this:

+
@app.route('/register', methods=['GET', 'POST'])
+def register():
+    form = RegistrationForm(request.form)
+    if request.method == 'POST' and form.validate():
+        user = User(form.username.data, form.email.data,
+                    form.password.data)
+        db_session.add(user)
+        flash('Thanks for registering')
+        return redirect(url_for('login'))
+    return render_template('register.html', form=form)
+
+
+

Notice that we are implying that the view is using SQLAlchemy here +(SQLAlchemy in Flask) but this is no requirement of course. Adapt +the code as necessary.

+

Things to remember:

+
    +
  1. create the form from the request form value if +the data is submitted via the HTTP POST method and +args if the data is submitted as GET.
  2. +
  3. to validate the data, call the validate() +method which will return True if the data validates, False +otherwise.
  4. +
  5. to access individual values from the form, access form.<NAME>.data.
  6. +
+
+
+

Forms in Templates

+

Now to the template side. When you pass the form to the templates you can +easily render them there. Look at the following example template to see +how easy this is. WTForms does half the form generation for us already. +To make it even nicer, we can write a macro that renders a field with +label and a list of errors if there are any.

+

Here’s an example _formhelpers.html template with such a macro:

+
{% macro render_field(field) %}
+  <dt>{{ field.label }}
+  <dd>{{ field(**kwargs)|safe }}
+  {% if field.errors %}
+    <ul class="errors">
+    {% for error in field.errors %}<li>{{ error }}{% endfor %}
+    </ul>
+  {% endif %}
+  </dd>
+{% endmacro %}
+
+
+

This macro accepts a couple of keyword arguments that are forwarded to +WTForm’s field function that renders the field for us. The keyword +arguments will be inserted as HTML attributes. So for example you can +call render_field(form.username, class='username') to add a class to +the input element. Note that WTForms returns standard Python unicode +strings, so we have to tell Jinja2 that this data is already HTML escaped +with the |safe filter.

+

Here the register.html template for the function we used above which +takes advantage of the _formhelpers.html template:

+
{% from "_formhelpers.html" import render_field %}
+<form method="post" action="/register">
+  <dl>
+    {{ render_field(form.username) }}
+    {{ render_field(form.email) }}
+    {{ render_field(form.password) }}
+    {{ render_field(form.confirm) }}
+    {{ render_field(form.accept_tos) }}
+  </dl>
+  <p><input type=submit value=Register>
+</form>
+
+
+

For more information about WTForms, head over to the WTForms +website.

+
+
+ + +
+
+
+
+
+

Table Of Contents

+ +

Related Topics

+ +

This Page

+ + + +
+
+
+
+ + + \ No newline at end of file -- cgit v0.9.1