Subclassing newforms Form.form to rendering form via django template

Newforms are made to make any kind of customizations easy. Sometimes standard methods of rendering HTML/XML/other content of the django.newforms is not enough to completely satisfy all web design needs so you may want to present forms in own templates.

Using templates to render output as HTML or XML is straighforward, and in many cases easier then using standard approach.

Step by step guide

  1. Create file in your project:

yourproject/utils/newforms.py:

from django import newforms as forms
from django.newforms.forms import BoundField
from django.template import Context, loader

class TemplatedForm(forms.Form):
    def output_via_template(self):
        "Helper function for fieldsting fields data from form."
        bound_fields = [BoundField(self, field, name) for name, field \
                        in self.fields.items()]
        c = Context(dict(form = self, bound_fields = bound_fields))
        t = loader.get_template('newforms/form.html')
        return t.render(c)
        
    #working with the development version from trunk
    #use __unicode__ instead of __str__

    def __str__(self):
        return self.output_via_template()
  1. Create HTML templates, here is very simple template form form and field:

file: templates/newforms/form.html

{% for field in bound_fields %}
{% include "newforms/field.html" %}
{% endfor %}

file: templates/newforms/field.html

<tr{% if field.errors %} class="errors" {% endif%}>
  <th>
    <label for="id_{{ field.name }}">{{ field.label }}{% if field.field.required %}<span class="required">*</span>{% endif %}:</label>
  </th>
  <td>
    {{ field }}
    {% if field.errors %}{{ field.errors }}{% endif %}
    {% if field.help_text %}
    <p class="helptext">({{ field.help_text }})</p>
    {% endif %}
  </td>
</tr>

Example of usage from view.py: file: myproject/myapp/myview.py

class PersonalInfoForm(TemplatedForm):
    school_or_institution = forms.CharField(max_length=100,required=False)
    first_name = forms.CharField(max_length=100,required=False)
    last_name = forms.CharField(max_length=100,required=False)
    email = forms.EmailField()
    personal_website_url = forms.CharField(max_length=100,required=False)
    button = forms.CharField(required=False,widget=forms.HiddenInput)

References

  1. http://www.djangosnippets.org/snippets/121/
  2. http://www.djangosnippets.org/snippets/263/
Last modified 17 years ago Last modified on Sep 5, 2007, 1:38:33 AM
Note: See TracWiki for help on using the wiki.
Back to Top