Skip to content

Commit

Permalink
Fixed #4232 -- Added example usages to the newforms documentation. Th…
Browse files Browse the repository at this point in the history
…anks, Joe

Heck.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@5294 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed May 19, 2007
1 parent d8db013 commit 0f424f5
Showing 1 changed file with 109 additions and 0 deletions.
109 changes: 109 additions & 0 deletions docs/newforms.txt
Expand Up @@ -313,6 +313,31 @@ record, here's what happens with unbound forms::
... ...
AttributeError: 'ContactForm' object has no attribute 'cleaned_data' AttributeError: 'ContactForm' object has no attribute 'cleaned_data'



Example View
~~~~~~~~~~~~

Putting this all together, here is a simple view method that uses our contact
form::

from django.shortcuts import render_to_response
from django import newforms as forms

class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField()
sender = forms.EmailField()
cc_myself = forms.BooleanField()

def contact(request):
if request.POST:
f = ContactForm(request.POST)
if f.is_valid:
# ... do something with f.cleaned_data
else:
f = ContactForm()
return render_to_response('contact.html', {'form': f})

Outputting forms as HTML Outputting forms as HTML
------------------------ ------------------------


Expand Down Expand Up @@ -389,6 +414,12 @@ containing one field::
<p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p> <p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p>
<p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p> <p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>


In a template, you can invoke this if the form has been handed into the
context. For example::

{{ f.as_p }}


``as_ul()`` ``as_ul()``
~~~~~~~~~~~ ~~~~~~~~~~~


Expand All @@ -405,6 +436,11 @@ so that you can specify any HTML attributes on the ``<ul>`` for flexibility::
<li><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></li> <li><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></li>
<li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li> <li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li>


In a template, you can invoke this if the form has been handed into the
context. For example::

{{ f.as_ul }}

``as_table()`` ``as_table()``
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~


Expand All @@ -421,6 +457,18 @@ calls its ``as_table()`` method behind the scenes::
<tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr> <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr>
<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr> <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>


In a template, you can invoke this if the form has been handed into the
context. For example::

{{ f.as_table }}

which is the same as

::

{{ f }}


Configuring HTML ``<label>`` tags Configuring HTML ``<label>`` tags
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Expand Down Expand Up @@ -602,6 +650,67 @@ when printed::
>>> str(f['subject'].errors) >>> str(f['subject'].errors)
'' ''


In the templates
----------------

Using the above example, let's put this into a view and show how you can use
these parts from the template designer's point of view. Assuming you start
with a view like this::

def contact(request):
form = ContactForm()
if request.method == 'POST':
new_data = request.POST.copy()
form = ContactForm(new_data)
if form.is_valid():
# do form processing here...
return render_to_response('contact.html', {'form': form})

...you can have a simple template that uses the shortcuts ``form.as_ul``,
``form.as_p``, or ``form.as_table`` (which is the default rendering method for
a form variable). An example ``contact.html`` template::

<form method="POST">
{{ form }}
</form>

Equivalently, you could write::

<form method="POST">
{{ form.as_table }}
</form>

If you wanted to work with the individual inputs of the form, you can either
call out the fields directly or iterate over them::

<form method="POST">
<dl>
{% for field in form %}
<dt>{{ field.label }}</dt>
<dd>{{ field }}</dd>
<dd>{{ field.help_text }}</dd>
{% if field.errors %}<dd class="myerrors">{{ field.errors }}</dd>{% endif %}
{% endfor %}
</dl>
</form>

Alternatively::

<form method="POST">
<ul class="myformclass">
<li>{{ form.sender.label }} {{ form.sender.label }}</li>
<li class="helptext" >{{ form.sender.help_text }}</li>
{% if form.sender.errors %}<ul class="errorlist">{{ form.sender.errors }}</dd>{% endif %}

<li>{{ form.subject.label }} {{ form.subject.label }}</li>
<li class="helptext" >{{ form.subject.help_text }}</li>
{% if form.subject.errors %}<ul class="errorlist">{{ form.subject.errors }}</dd>{% endif %}

...
</ul>
</form>


Subclassing forms Subclassing forms
----------------- -----------------


Expand Down

0 comments on commit 0f424f5

Please sign in to comment.