Django

Code

Ticket #4975: label_colon_removal.patch

File label_colon_removal.patch, 90.3 kB (added by gnuvince, 3 years ago)
  • django/newforms/forms.py

    old new  
    129129                    output.append(error_row % force_unicode(bf_errors)) 
    130130                if bf.label: 
    131131                    label = escape(force_unicode(bf.label)) 
    132                     # Only add a colon if the label does not end in punctuation. 
    133                     if label[-1] not in ':?.!': 
    134                         label += ':' 
    135132                    label = bf.label_tag(label) or '' 
    136133                else: 
    137134                    label = '' 
  • tests/modeltests/model_forms/models.py

    old new  
    8080>>> CategoryForm = form_for_model(Category) 
    8181>>> f = CategoryForm() 
    8282>>> print f 
    83 <tr><th><label for="id_name">Name:</label></th><td><input id="id_name" type="text" name="name" maxlength="20" /></td></tr> 
    84 <tr><th><label for="id_slug">Slug:</label></th><td><input id="id_slug" type="text" name="slug" maxlength="20" /></td></tr> 
    85 <tr><th><label for="id_url">The URL:</label></th><td><input id="id_url" type="text" name="url" maxlength="40" /></td></tr> 
     83<tr><th><label for="id_name">Name</label></th><td><input id="id_name" type="text" name="name" maxlength="20" /></td></tr> 
     84<tr><th><label for="id_slug">Slug</label></th><td><input id="id_slug" type="text" name="slug" maxlength="20" /></td></tr> 
     85<tr><th><label for="id_url">The URL</label></th><td><input id="id_url" type="text" name="url" maxlength="40" /></td></tr> 
    8686>>> print f.as_ul() 
    87 <li><label for="id_name">Name:</label> <input id="id_name" type="text" name="name" maxlength="20" /></li> 
    88 <li><label for="id_slug">Slug:</label> <input id="id_slug" type="text" name="slug" maxlength="20" /></li> 
    89 <li><label for="id_url">The URL:</label> <input id="id_url" type="text" name="url" maxlength="40" /></li> 
     87<li><label for="id_name">Name</label> <input id="id_name" type="text" name="name" maxlength="20" /></li> 
     88<li><label for="id_slug">Slug</label> <input id="id_slug" type="text" name="slug" maxlength="20" /></li> 
     89<li><label for="id_url">The URL</label> <input id="id_url" type="text" name="url" maxlength="40" /></li> 
    9090>>> print f['name'] 
    9191<input id="id_name" type="text" name="name" maxlength="20" /> 
    9292 
    9393>>> f = CategoryForm(auto_id=False) 
    9494>>> print f.as_ul() 
    95 <li>Name: <input type="text" name="name" maxlength="20" /></li> 
    96 <li>Slug: <input type="text" name="slug" maxlength="20" /></li> 
    97 <li>The URL: <input type="text" name="url" maxlength="40" /></li> 
     95<li>Name <input type="text" name="name" maxlength="20" /></li> 
     96<li>Slug <input type="text" name="slug" maxlength="20" /></li> 
     97<li>The URL <input type="text" name="url" maxlength="40" /></li> 
    9898 
    9999>>> f = CategoryForm({'name': 'Entertainment', 'slug': 'entertainment', 'url': 'entertainment'}) 
    100100>>> f.is_valid() 
     
    164164>>> ArticleForm = form_for_model(Article) 
    165165>>> f = ArticleForm(auto_id=False) 
    166166>>> print f 
    167 <tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr> 
    168 <tr><th>Slug:</th><td><input type="text" name="slug" maxlength="50" /></td></tr> 
    169 <tr><th>Pub date:</th><td><input type="text" name="pub_date" /></td></tr> 
    170 <tr><th>Writer:</th><td><select name="writer"> 
     167<tr><th>Headline</th><td><input type="text" name="headline" maxlength="50" /></td></tr> 
     168<tr><th>Slug</th><td><input type="text" name="slug" maxlength="50" /></td></tr> 
     169<tr><th>Pub date</th><td><input type="text" name="pub_date" /></td></tr> 
     170<tr><th>Writer</th><td><select name="writer"> 
    171171<option value="" selected="selected">---------</option> 
    172172<option value="1">Mike Royko</option> 
    173173<option value="2">Bob Woodward</option> 
    174174</select></td></tr> 
    175 <tr><th>Article:</th><td><textarea rows="10" cols="40" name="article"></textarea></td></tr> 
    176 <tr><th>Status:</th><td><select name="status"> 
     175<tr><th>Article</th><td><textarea rows="10" cols="40" name="article"></textarea></td></tr> 
     176<tr><th>Status</th><td><select name="status"> 
    177177<option value="" selected="selected">---------</option> 
    178178<option value="1">Draft</option> 
    179179<option value="2">Pending</option> 
    180180<option value="3">Live</option> 
    181181</select></td></tr> 
    182 <tr><th>Categories:</th><td><select multiple="multiple" name="categories"> 
     182<tr><th>Categories</th><td><select multiple="multiple" name="categories"> 
    183183<option value="1">Entertainment</option> 
    184184<option value="2">It&#39;s a test</option> 
    185185<option value="3">Third test</option> 
     
    194194>>> PartialArticleForm = form_for_model(Article, fields=('headline','pub_date')) 
    195195>>> f = PartialArticleForm(auto_id=False) 
    196196>>> print f 
    197 <tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr> 
    198 <tr><th>Pub date:</th><td><input type="text" name="pub_date" /></td></tr> 
     197<tr><th>Headline</th><td><input type="text" name="headline" maxlength="50" /></td></tr> 
     198<tr><th>Pub date</th><td><input type="text" name="pub_date" /></td></tr> 
    199199 
    200200You can pass a custom Form class to form_for_model. Make sure it's a 
    201201subclass of BaseForm, not Form. 
     
    214214>>> RoykoForm = form_for_instance(w) 
    215215>>> f = RoykoForm(auto_id=False) 
    216216>>> print f 
    217 <tr><th>Name:</th><td><input type="text" name="name" value="Mike Royko" maxlength="50" /><br />Use both first and last names.</td></tr> 
     217<tr><th>Name</th><td><input type="text" name="name" value="Mike Royko" maxlength="50" /><br />Use both first and last names.</td></tr> 
    218218 
    219219>>> art = Article(headline='Test article', slug='test-article', pub_date=datetime.date(1988, 1, 4), writer=w, article='Hello.') 
    220220>>> art.save() 
     
    223223>>> TestArticleForm = form_for_instance(art) 
    224224>>> f = TestArticleForm(auto_id=False) 
    225225>>> print f.as_ul() 
    226 <li>Headline: <input type="text" name="headline" value="Test article" maxlength="50" /></li> 
    227 <li>Slug: <input type="text" name="slug" value="test-article" maxlength="50" /></li> 
    228 <li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li> 
    229 <li>Writer: <select name="writer"> 
     226<li>Headline <input type="text" name="headline" value="Test article" maxlength="50" /></li> 
     227<li>Slug <input type="text" name="slug" value="test-article" maxlength="50" /></li> 
     228<li>Pub date <input type="text" name="pub_date" value="1988-01-04" /></li> 
     229<li>Writer <select name="writer"> 
    230230<option value="">---------</option> 
    231231<option value="1" selected="selected">Mike Royko</option> 
    232232<option value="2">Bob Woodward</option> 
    233233</select></li> 
    234 <li>Article: <textarea rows="10" cols="40" name="article">Hello.</textarea></li> 
    235 <li>Status: <select name="status"> 
     234<li>Article <textarea rows="10" cols="40" name="article">Hello.</textarea></li> 
     235<li>Status <select name="status"> 
    236236<option value="" selected="selected">---------</option> 
    237237<option value="1">Draft</option> 
    238238<option value="2">Pending</option> 
    239239<option value="3">Live</option> 
    240240</select></li> 
    241 <li>Categories: <select multiple="multiple" name="categories"> 
     241<li>Categories <select multiple="multiple" name="categories"> 
    242242<option value="1">Entertainment</option> 
    243243<option value="2">It&#39;s a test</option> 
    244244<option value="3">Third test</option> 
     
    258258>>> PartialArticleForm = form_for_instance(art, fields=('headline', 'slug', 'pub_date')) 
    259259>>> f = PartialArticleForm({'headline': u'New headline', 'slug': 'new-headline', 'pub_date': u'1988-01-04'}, auto_id=False) 
    260260>>> print f.as_ul() 
    261 <li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /></li> 
    262 <li>Slug: <input type="text" name="slug" value="new-headline" maxlength="50" /></li> 
    263 <li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li> 
     261<li>Headline <input type="text" name="headline" value="New headline" maxlength="50" /></li> 
     262<li>Slug <input type="text" name="slug" value="new-headline" maxlength="50" /></li> 
     263<li>Pub date <input type="text" name="pub_date" value="1988-01-04" /></li> 
    264264>>> f.is_valid() 
    265265True 
    266266>>> new_art = f.save() 
     
    279279>>> TestArticleForm = form_for_instance(new_art) 
    280280>>> f = TestArticleForm(auto_id=False) 
    281281>>> print f.as_ul() 
    282 <li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /></li> 
    283 <li>Slug: <input type="text" name="slug" value="new-headline" maxlength="50" /></li> 
    284 <li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li> 
    285 <li>Writer: <select name="writer"> 
     282<li>Headline <input type="text" name="headline" value="New headline" maxlength="50" /></li> 
     283<li>Slug <input type="text" name="slug" value="new-headline" maxlength="50" /></li> 
     284<li>Pub date <input type="text" name="pub_date" value="1988-01-04" /></li> 
     285<li>Writer <select name="writer"> 
    286286<option value="">---------</option> 
    287287<option value="1" selected="selected">Mike Royko</option> 
    288288<option value="2">Bob Woodward</option> 
    289289</select></li> 
    290 <li>Article: <textarea rows="10" cols="40" name="article">Hello.</textarea></li> 
    291 <li>Status: <select name="status"> 
     290<li>Article <textarea rows="10" cols="40" name="article">Hello.</textarea></li> 
     291<li>Status <select name="status"> 
    292292<option value="" selected="selected">---------</option> 
    293293<option value="1">Draft</option> 
    294294<option value="2">Pending</option> 
    295295<option value="3">Live</option> 
    296296</select></li> 
    297 <li>Categories: <select multiple="multiple" name="categories"> 
     297<li>Categories <select multiple="multiple" name="categories"> 
    298298<option value="1" selected="selected">Entertainment</option> 
    299299<option value="2">It&#39;s a test</option> 
    300300<option value="3">Third test</option> 
     
    387387>>> ArticleForm = form_for_model(Article) 
    388388>>> f = ArticleForm(auto_id=False) 
    389389>>> print f.as_ul() 
    390 <li>Headline: <input type="text" name="headline" maxlength="50" /></li> 
    391 <li>Slug: <input type="text" name="slug" maxlength="50" /></li> 
    392 <li>Pub date: <input type="text" name="pub_date" /></li> 
    393 <li>Writer: <select name="writer"> 
     390<li>Headline <input type="text" name="headline" maxlength="50" /></li> 
     391<li>Slug <input type="text" name="slug" maxlength="50" /></li> 
     392<li>Pub date <input type="text" name="pub_date" /></li> 
     393<li>Writer <select name="writer"> 
    394394<option value="" selected="selected">---------</option> 
    395395<option value="1">Mike Royko</option> 
    396396<option value="2">Bob Woodward</option> 
    397397</select></li> 
    398 <li>Article: <textarea rows="10" cols="40" name="article"></textarea></li> 
    399 <li>Status: <select name="status"> 
     398<li>Article <textarea rows="10" cols="40" name="article"></textarea></li> 
     399<li>Status <select name="status"> 
    400400<option value="" selected="selected">---------</option> 
    401401<option value="1">Draft</option> 
    402402<option value="2">Pending</option> 
    403403<option value="3">Live</option> 
    404404</select></li> 
    405 <li>Categories: <select multiple="multiple" name="categories"> 
     405<li>Categories <select multiple="multiple" name="categories"> 
    406406<option value="1">Entertainment</option> 
    407407<option value="2">It&#39;s a test</option> 
    408408<option value="3">Third</option> 
     
    412412>>> Writer.objects.create(name='Carl Bernstein') 
    413413<Writer: Carl Bernstein> 
    414414>>> print f.as_ul() 
    415 <li>Headline: <input type="text" name="headline" maxlength="50" /></li> 
    416 <li>Slug: <input type="text" name="slug" maxlength="50" /></li> 
    417 <li>Pub date: <input type="text" name="pub_date" /></li> 
    418 <li>Writer: <select name="writer"> 
     415<li>Headline <input type="text" name="headline" maxlength="50" /></li> 
     416<li>Slug <input type="text" name="slug" maxlength="50" /></li> 
     417<li>Pub date <input type="text" name="pub_date" /></li> 
     418<li>Writer <select name="writer"> 
    419419<option value="" selected="selected">---------</option> 
    420420<option value="1">Mike Royko</option> 
    421421<option value="2">Bob Woodward</option> 
    422422<option value="3">Carl Bernstein</option> 
    423423</select></li> 
    424 <li>Article: <textarea rows="10" cols="40" name="article"></textarea></li> 
    425 <li>Status: <select name="status"> 
     424<li>Article <textarea rows="10" cols="40" name="article"></textarea></li> 
     425<li>Status <select name="status"> 
    426426<option value="" selected="selected">---------</option> 
    427427<option value="1">Draft</option> 
    428428<option value="2">Pending</option> 
    429429<option value="3">Live</option> 
    430430</select></li> 
    431 <li>Categories: <select multiple="multiple" name="categories"> 
     431<li>Categories <select multiple="multiple" name="categories"> 
    432432<option value="1">Entertainment</option> 
    433433<option value="2">It&#39;s a test</option> 
    434434<option value="3">Third</option> 
  • tests/regressiontests/forms/tests.py

    old new  
    347347...     somechoice = ChoiceField(choices=chain((('', '-'*9),), [(thing['id'], thing['name']) for thing in things])) 
    348348>>> f = SomeForm() 
    349349>>> f.as_table() 
    350 u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>' 
     350u'<tr><th><label for="id_somechoice">Somechoice</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>' 
    351351>>> f.as_table() 
    352 u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>' 
     352u'<tr><th><label for="id_somechoice">Somechoice</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>' 
    353353>>> f = SomeForm({'somechoice': 2}) 
    354354>>> f.as_table() 
    355 u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="">---------</option>\n<option value="1">And Boom</option>\n<option value="2" selected="selected">One More Thing!</option>\n</select></td></tr>' 
     355u'<tr><th><label for="id_somechoice">Somechoice</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="">---------</option>\n<option value="1">And Boom</option>\n<option value="2" selected="selected">One More Thing!</option>\n</select></td></tr>' 
    356356 
    357357You can also pass 'choices' to the constructor: 
    358358>>> w = Select(choices=[(1, 1), (2, 2), (3, 3)]) 
     
    20482048Last name Lennon 
    20492049Birthday 1940-10-9 
    20502050>>> print p 
    2051 <tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr> 
    2052 <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" value="Lennon" id="id_last_name" /></td></tr> 
    2053 <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr> 
     2051<tr><th><label for="id_first_name">First name</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr> 
     2052<tr><th><label for="id_last_name">Last name</label></th><td><input type="text" name="last_name" value="Lennon" id="id_last_name" /></td></tr> 
     2053<tr><th><label for="id_birthday">Birthday</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr> 
    20542054 
    20552055Empty dictionaries are valid, too. 
    20562056>>> p = Person({}) 
     
    20652065... 
    20662066AttributeError: 'Person' object has no attribute 'cleaned_data' 
    20672067>>> print p 
    2068 <tr><th><label for="id_first_name">First name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr> 
    2069 <tr><th><label for="id_last_name">Last name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="last_name" id="id_last_name" /></td></tr> 
    2070 <tr><th><label for="id_birthday">Birthday:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="birthday" id="id_birthday" /></td></tr> 
     2068<tr><th><label for="id_first_name">First name</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr> 
     2069<tr><th><label for="id_last_name">Last name</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="last_name" id="id_last_name" /></td></tr> 
     2070<tr><th><label for="id_birthday">Birthday</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="birthday" id="id_birthday" /></td></tr> 
    20712071>>> print p.as_table() 
    2072 <tr><th><label for="id_first_name">First name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr> 
    2073 <tr><th><label for="id_last_name">Last name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="last_name" id="id_last_name" /></td></tr> 
    2074 <tr><th><label for="id_birthday">Birthday:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="birthday" id="id_birthday" /></td></tr> 
     2072<tr><th><label for="id_first_name">First name</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr> 
     2073<tr><th><label for="id_last_name">Last name</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="last_name" id="id_last_name" /></td></tr> 
     2074<tr><th><label for="id_birthday">Birthday</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="birthday" id="id_birthday" /></td></tr> 
    20752075>>> print p.as_ul() 
    2076 <li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li> 
    2077 <li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li> 
    2078 <li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></li> 
     2076<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_first_name">First name</label> <input type="text" name="first_name" id="id_first_name" /></li> 
     2077<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_last_name">Last name</label> <input type="text" name="last_name" id="id_last_name" /></li> 
     2078<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_birthday">Birthday</label> <input type="text" name="birthday" id="id_birthday" /></li> 
    20792079>>> print p.as_p() 
    20802080<ul class="errorlist"><li>This field is required.</li></ul> 
    2081 <p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p> 
     2081<p><label for="id_first_name">First name</label> <input type="text" name="first_name" id="id_first_name" /></p> 
    20822082<ul class="errorlist"><li>This field is required.</li></ul> 
    2083 <p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p> 
     2083<p><label for="id_last_name">Last name</label> <input type="text" name="last_name" id="id_last_name" /></p> 
    20842084<ul class="errorlist"><li>This field is required.</li></ul> 
    2085 <p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></p> 
     2085<p><label for="id_birthday">Birthday</label> <input type="text" name="birthday" id="id_birthday" /></p> 
    20862086 
    20872087If you don't pass any values to the Form's __init__(), or if you pass None, 
    20882088the Form will be considered unbound and won't do any validation. Form.errors 
     
    20992099... 
    21002100AttributeError: 'Person' object has no attribute 'cleaned_data' 
    21012101>>> print p 
    2102 <tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> 
    2103 <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr> 
    2104 <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" id="id_birthday" /></td></tr> 
     2102<tr><th><label for="id_first_name">First name</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> 
     2103<tr><th><label for="id_last_name">Last name</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr> 
     2104<tr><th><label for="id_birthday">Birthday</label></th><td><input type="text" name="birthday" id="id_birthday" /></td></tr> 
    21052105>>> print p.as_table() 
    2106 <tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> 
    2107 <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr> 
    2108 <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" id="id_birthday" /></td></tr> 
     2106<tr><th><label for="id_first_name">First name</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> 
     2107<tr><th><label for="id_last_name">Last name</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr> 
     2108<tr><th><label for="id_birthday">Birthday</label></th><td><input type="text" name="birthday" id="id_birthday" /></td></tr> 
    21092109>>> print p.as_ul() 
    2110 <li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li> 
    2111 <li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li> 
    2112 <li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></li> 
     2110<li><label for="id_first_name">First name</label> <input type="text" name="first_name" id="id_first_name" /></li> 
     2111<li><label for="id_last_name">Last name</label> <input type="text" name="last_name" id="id_last_name" /></li> 
     2112<li><label for="id_birthday">Birthday</label> <input type="text" name="birthday" id="id_birthday" /></li> 
    21132113>>> print p.as_p() 
    2114 <p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p> 
    2115 <p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p> 
    2116 <p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></p> 
     2114<p><label for="id_first_name">First name</label> <input type="text" name="first_name" id="id_first_name" /></p> 
     2115<p><label for="id_last_name">Last name</label> <input type="text" name="last_name" id="id_last_name" /></p> 
     2116<p><label for="id_birthday">Birthday</label> <input type="text" name="birthday" id="id_birthday" /></p> 
    21172117 
    21182118Unicode values are handled properly. 
    21192119>>> p = Person({'first_name': u'John', 'last_name': u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111', 'birthday': '1940-10-9'}) 
    21202120>>> p.as_table() 
    2121 u'<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr>\n<tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></td></tr>\n<tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr>' 
     2121u'<tr><th><label for="id_first_name">First name</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr>\n<tr><th><label for="id_last_name">Last name</label></th><td><input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></td></tr>\n<tr><th><label for="id_birthday">Birthday</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr>' 
    21222122>>> p.as_ul() 
    2123 u'<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></li>\n<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></li>\n<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></li>' 
     2123u'<li><label for="id_first_name">First name</label> <input type="text" name="first_name" value="John" id="id_first_name" /></li>\n<li><label for="id_last_name">Last name</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></li>\n<li><label for="id_birthday">Birthday</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></li>' 
    21242124>>> p.as_p() 
    2125 u'<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></p>\n<p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></p>\n<p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></p>' 
     2125u'<p><label for="id_first_name">First name</label> <input type="text" name="first_name" value="John" id="id_first_name" /></p>\n<p><label for="id_last_name">Last name</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></p>\n<p><label for="id_birthday">Birthday</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></p>' 
    21262126 
    21272127>>> p = Person({'last_name': u'Lennon'}) 
    21282128>>> p.errors 
     
    22002200the human-readable labels for a field. 
    22012201>>> p = Person(auto_id='%s_id') 
    22022202>>> print p.as_table() 
    2203 <tr><th><label for="first_name_id">First name:</label></th><td><input type="text" name="first_name" id="first_name_id" /></td></tr> 
    2204 <tr><th><label for="last_name_id">Last name:</label></th><td><input type="text" name="last_name" id="last_name_id" /></td></tr> 
    2205 <tr><th><label for="birthday_id">Birthday:</label></th><td><input type="text" name="birthday" id="birthday_id" /></td></tr> 
     2203<tr><th><label for="first_name_id">First name</label></th><td><input type="text" name="first_name" id="first_name_id" /></td></tr> 
     2204<tr><th><label for="last_name_id">Last name</label></th><td><input type="text" name="last_name" id="last_name_id" /></td></tr> 
     2205<tr><th><label for="birthday_id">Birthday</label></th><td><input type="text" name="birthday" id="birthday_id" /></td></tr> 
    22062206>>> print p.as_ul() 
    2207 <li><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></li> 
    2208 <li><label for="last_name_id">Last name:</label> <input type="text" name="last_name" id="last_name_id" /></li> 
    2209 <li><label for="birthday_id">Birthday:</label> <input type="text" name="birthday" id="birthday_id" /></li> 
     2207<li><label for="first_name_id">First name</label> <input type="text" name="first_name" id="first_name_id" /></li> 
     2208<li><label for="last_name_id">Last name</label> <input type="text" name="last_name" id="last_name_id" /></li> 
     2209<li><label for="birthday_id">Birthday</label> <input type="text" name="birthday" id="birthday_id" /></li> 
    22102210>>> print p.as_p() 
    2211 <p><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></p> 
    2212 <p><label for="last_name_id">Last name:</label> <input type="text" name="last_name" id="last_name_id" /></p> 
    2213 <p><label for="birthday_id">Birthday:</label> <input type="text" name="birthday" id="birthday_id" /></p> 
     2211<p><label for="first_name_id">First name</label> <input type="text" name="first_name" id="first_name_id" /></p> 
     2212<p><label for="last_name_id">Last name</label> <input type="text" name="last_name" id="last_name_id" /></p> 
     2213<p><label for="birthday_id">Birthday</label> <input type="text" name="birthday" id="birthday_id" /></p> 
    22142214 
    22152215If auto_id is any True value whose str() does not contain '%s', the "id" 
    22162216attribute will be the name of the field. 
    22172217>>> p = Person(auto_id=True) 
    22182218>>> print p.as_ul() 
    2219 <li><label for="first_name">First name:</label> <input type="text" name="first_name" id="first_name" /></li> 
    2220 <li><label for="last_name">Last name:</label> <input type="text" name="last_name" id="last_name" /></li> 
    2221 <li><label for="birthday">Birthday:</label> <input type="text" name="birthday" id="birthday" /></li> 
     2219<li><label for="first_name">First name</label> <input type="text" name="first_name" id="first_name" /></li> 
     2220<li><label for="last_name">Last name</label> <input type="text" name="last_name" id="last_name" /></li> 
     2221<li><label for="birthday">Birthday</label> <input type="text" name="birthday" id="birthday" /></li> 
    22222222 
    22232223If auto_id is any False value, an "id" attribute won't be output unless it 
    22242224was manually entered. 
    22252225>>> p = Person(auto_id=False) 
    22262226>>> print p.as_ul() 
    2227 <li>First name: <input type="text" name="first_name" /></li> 
    2228 <li>Last name: <input type="text" name="last_name" /></li> 
    2229 <li>Birthday: <input type="text" name="birthday" /></li> 
     2227<li>First name <input type="text" name="first_name" /></li> 
     2228<li>Last name <input type="text" name="last_name" /></li> 
     2229<li>Birthday <input type="text" name="birthday" /></li> 
    22302230 
    22312231In this example, auto_id is False, but the "id" attribute for the "first_name" 
    22322232field is given. Also note that field gets a <label>, while the others don't. 
     
    22362236...     birthday = DateField() 
    22372237>>> p = PersonNew(auto_id=False) 
    22382238>>> print p.as_ul() 
    2239 <li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /></li> 
    2240 <li>Last name: <input type="text" name="last_name" /></li> 
    2241 <li>Birthday: <input type="text" name="birthday" /></li> 
     2239<li><label for="first_name_id">First name</label> <input type="text" id="first_name_id" name="first_name" /></li> 
     2240<li>Last name <input type="text" name="last_name" /></li> 
     2241<li>Birthday <input type="text" name="birthday" /></li> 
    22422242 
    22432243If the "id" attribute is specified in the Form and auto_id is True, the "id" 
    22442244attribute in the Form gets precedence. 
    22452245>>> p = PersonNew(auto_id=True) 
    22462246>>> print p.as_ul() 
    2247 <li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /></li> 
    2248 <li><label for="last_name">Last name:</label> <input type="text" name="last_name" id="last_name" /></li> 
    2249 <li><label for="birthday">Birthday:</label> <input type="text" name="birthday" id="birthday" /></li> 
     2247<li><label for="first_name_id">First name</label> <input type="text" id="first_name_id" name="first_name" /></li> 
     2248<li><label for="last_name">Last name</label> <input type="text" name="last_name" id="last_name" /></li> 
     2249<li><label for="birthday">Birthday</label> <input type="text" name="birthday" id="birthday" /></li> 
    22502250 
    22512251>>> class SignupForm(Form): 
    22522252...     email = EmailField() 
     
    23942394<li><label><input type="radio" name="language" value="J" /> Java</label></li> 
    23952395</ul> 
    23962396>>> print f 
    2397 <tr><th>Name:</th><td><input type="text" name="name" /></td></tr> 
    2398 <tr><th>Language:</th><td><ul> 
     2397<tr><th>Name</th><td><input type="text" name="name" /></td></tr> 
     2398<tr><th>Language</th><td><ul> 
    23992399<li><label><input type="radio" name="language" value="P" /> Python</label></li> 
    24002400<li><label><input type="radio" name="language" value="J" /> Java</label></li> 
    24012401</ul></td></tr> 
    24022402>>> print f.as_ul() 
    2403 <li>Name: <input type="text" name="name" /></li> 
    2404 <li>Language: <ul> 
     2403<li>Name <input type="text" name="name" /></li> 
     2404<li>Language <ul> 
    24052405<li><label><input type="radio" name="language" value="P" /> Python</label></li> 
    24062406<li><label><input type="radio" name="language" value="J" /> Java</label></li> 
    24072407</ul></li> 
     
    24202420either as_table() or as_ul(), the label for the RadioSelect will point to the 
    24212421ID of the *first* radio button. 
    24222422>>> print f 
    2423 <tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" id="id_name" /></td></tr> 
    2424 <tr><th><label for="id_language_0">Language:</label></th><td><ul> 
     2423<tr><th><label for="id_name">Name</label></th><td><input type="text" name="name" id="id_name" /></td></tr> 
     2424<tr><th><label for="id_language_0">Language</label></th><td><ul> 
    24252425<li><label><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 
    24262426<li><label><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 
    24272427</ul></td></tr> 
    24282428>>> print f.as_ul() 
    2429 <li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li> 
    2430 <li><label for="id_language_0">Language:</label> <ul> 
     2429<li><label for="id_name">Name</label> <input type="text" name="name" id="id_name" /></li> 
     2430<li><label for="id_language_0">Language</label> <ul> 
    24312431<li><label><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 
    24322432<li><label><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 
    24332433</ul></li> 
    24342434>>> print f.as_p() 
    2435 <p><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></p> 
    2436 <p><label for="id_language_0">Language:</label> <ul> 
     2435<p><label for="id_name">Name</label> <input type="text" name="name" id="id_name" /></p> 
     2436<p><label for="id_language_0">Language</label> <ul> 
    24372437<li><label><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 
    24382438<li><label><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 
    24392439</ul></p> 
     
    25312531...     composers = MultipleChoiceField(choices=[('J', 'John Lennon'), ('P', 'Paul McCartney')], widget=MultipleHiddenInput) 
    25322532>>> f = SongFormHidden(MultiValueDict(dict(name=['Yesterday'], composers=['J', 'P'])), auto_id=False) 
    25332533>>> print f.as_ul() 
    2534 <li>Name: <input type="text" name="name" value="Yesterday" /><input type="hidden" name="composers" value="J" /> 
     2534<li>Name <input type="text" name="name" value="Yesterday" /><input type="hidden" name="composers" value="J" /> 
    25352535<input type="hidden" name="composers" value="P" /></li> 
    25362536 
    25372537When using CheckboxSelectMultiple, the framework expects a list of input and 
     
    25582558 
    25592559>>> f = EscapingForm({'special_name': "Nothing to escape"}, auto_id=False) 
    25602560>>> print f 
    2561 <tr><th>Special name:</th><td><ul class="errorlist"><li>Something&#39;s wrong with &#39;Nothing to escape&#39;</li></ul><input type="text" name="special_name" value="Nothing to escape" /></td></tr> 
     2561<tr><th>Special name</th><td><ul class="errorlist"><li>Something&#39;s wrong with &#39;Nothing to escape&#39;</li></ul><input type="text" name="special_name" value="Nothing to escape" /></td></tr> 
    25622562>>> f = EscapingForm({'special_name': "Should escape < & > and <script>alert('xss')</script>"}, auto_id=False) 
    25632563>>> print f 
    2564 <tr><th>Special name:</th><td><ul class="errorlist"><li>Something&#39;s wrong with &#39;Should escape &lt; &amp; &gt; and &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;&#39;</li></ul><input type="text" name="special_name" value="Should escape &lt; &amp; &gt; and &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;" /></td></tr> 
     2564<tr><th>Special name</th><td><ul class="errorlist"><li>Something&#39;s wrong with &#39;Should escape &lt; &amp; &gt; and &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;&#39;</li></ul><input type="text" name="special_name" value="Should escape &lt; &amp; &gt; and &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;" /></td></tr> 
    25652565 
    25662566# Validating multiple fields in relation to another ########################### 
    25672567 
     
    26152615{} 
    26162616>>> f = UserRegistration({}, auto_id=False) 
    26172617>>> print f.as_table() 
    2618 <tr><th>Username:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="username" maxlength="10" /></td></tr> 
    2619 <tr><th>Password1:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="password" name="password1" /></td></tr> 
    2620 <tr><th>Password2:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="password" name="password2" /></td></tr> 
     2618<tr><th>Username</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="username" maxlength="10" /></td></tr> 
     2619<tr><th>Password1</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="password" name="password1" /></td></tr> 
     2620<tr><th>Password2</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="password" name="password2" /></td></tr> 
    26212621>>> f.errors 
    26222622{'username': [u'This field is required.'], 'password1': [u'This field is required.'], 'password2': [u'This field is required.']} 
    26232623>>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'bar'}, auto_id=False) 
     
    26252625{'__all__': [u'Please make sure your passwords match.']} 
    26262626>>> print f.as_table() 
    26272627<tr><td colspan="2"><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></td></tr> 
    2628 <tr><th>Username:</th><td><input type="text" name="username" value="adrian" maxlength="10" /></td></tr> 
    2629 <tr><th>Password1:</th><td><input type="password" name="password1" value="foo" /></td></tr> 
    2630 <tr><th>Password2:</th><td><input type="password" name="password2" value="bar" /></td></tr> 
     2628<tr><th>Username</th><td><input type="text" name="username" value="adrian" maxlength="10" /></td></tr> 
     2629<tr><th>Password1</th><td><input type="password" name="password1" value="foo" /></td></tr> 
     2630<tr><th>Password2</th><td><input type="password" name="password2" value="bar" /></td></tr> 
    26312631>>> print f.as_ul() 
    26322632<li><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></li> 
    2633 <li>Username: <input type="text" name="username" value="adrian" maxlength="10" /></li> 
    2634 <li>Password1: <input type="password" name="password1" value="foo" /></li> 
    2635 <li>Password2: <input type="password" name="password2" value="bar" /></li> 
     2633<li>Username <input type="text" name="username" value="adrian" maxlength="10" /></li> 
     2634<li>Password1 <input type="password" name="password1" value="foo" /></li> 
     2635<li>Password2 <input type="password" name="password2" value="bar" /></li> 
    26362636>>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'}, auto_id=False) 
    26372637>>> f.errors 
    26382638{} 
     
    26522652...         self.fields['birthday'] = DateField() 
    26532653>>> p = Person(auto_id=False) 
    26542654>>> print p 
    2655 <tr><th>First name:</th><td><input type="text" name="first_name" /></td></tr> 
    2656 <tr><th>Last name:</th><td><input type="text" name="last_name" /></td></tr> 
    2657 <tr><th>Birthday:</th><td><input type="text" name="birthday" /></td></tr> 
     2655<tr><th>First name</th><td><input type="text" name="first_name" /></td></tr> 
     2656<tr><th>Last name</th><td><input type="text" name="last_name" /></td></tr> 
     2657<tr><th>Birthday</th><td><input type="text" name="birthday" /></td></tr> 
    26582658 
    26592659Instances of a dynamic Form do not persist fields from one Form instance to 
    26602660the next. 
     
    26662666>>> field_list = [('field1', CharField()), ('field2', CharField())] 
    26672667>>> my_form = MyForm(field_list=field_list) 
    26682668>>> print my_form 
    2669 <tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr> 
    2670 <tr><th>Field2:</th><td><input type="text" name="field2" /></td></tr> 
     2669<tr><th>Field1</th><td><input type="text" name="field1" /></td></tr> 
     2670<tr><th>Field2</th><td><input type="text" name="field2" /></td></tr> 
    26712671>>> field_list = [('field3', CharField()), ('field4', CharField())] 
    26722672>>> my_form = MyForm(field_list=field_list) 
    26732673>>> print my_form 
    2674 <tr><th>Field3:</th><td><input type="text" name="field3" /></td></tr> 
    2675 <tr><th>Field4:</th><td><input type="text" name="field4" /></td></tr> 
     2674<tr><th>Field3</th><td><input type="text" name="field3" /></td></tr> 
     2675<tr><th>Field4</th><td><input type="text" name="field4" /></td></tr> 
    26762676 
    26772677>>> class MyForm(Form): 
    26782678...     default_field_1 = CharField() 
     
    26842684>>> field_list = [('field1', CharField()), ('field2', CharField())] 
    26852685>>> my_form = MyForm(field_list=field_list) 
    26862686>>> print my_form 
    2687 <tr><th>Default field 1:</th><td><input type="text" name="default_field_1" /></td></tr> 
    2688 <tr><th>Default field 2:</th><td><input type="text" name="default_field_2" /></td></tr> 
    2689 <tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr> 
    2690 <tr><th>Field2:</th><td><input type="text" name="field2" /></td></tr> 
     2687<tr><th>Default field 1</th><td><input type="text" name="default_field_1" /></td></tr> 
     2688<tr><th>Default field 2</th><td><input type="text" name="default_field_2" /></td></tr> 
     2689<tr><th>Field1</th><td><input type="text" name="field1" /></td></tr> 
     2690<tr><th>Field2</th><td><input type="text" name="field2" /></td></tr> 
    26912691>>> field_list = [('field3', CharField()), ('field4', CharField())] 
    26922692>>> my_form = MyForm(field_list=field_list) 
    26932693>>> print my_form 
    2694 <tr><th>Default field 1:</th><td><input type="text" name="default_field_1" /></td></tr> 
    2695 <tr><th>Default field 2:</th><td><input type="text" name="default_field_2" /></td></tr> 
    2696 <tr><th>Field3:</th><td><input type="text" name="field3" /></td></tr> 
    2697 <tr><th>Field4:</th><td><input type="text" name="field4" /></td></tr> 
     2694<tr><th>Default field 1</th><td><input type="text" name="default_field_1" /></td></tr> 
     2695<tr><th>Default field 2</th><td><input type="text" name="default_field_2" /></td></tr> 
     2696<tr><th>Field3</th><td><input type="text" name="field3" /></td></tr> 
     2697<tr><th>Field4</th><td><input type="text" name="field4" /></td></tr> 
    26982698 
    26992699Similarly, changes to field attributes do not persist from one Form instance 
    27002700to the next. 
     
    27522752...     birthday = DateField() 
    27532753>>> p = Person(auto_id=False) 
    27542754>>> print p 
    2755 <tr><th>First name:</th><td><input type="text" name="first_name" /></td></tr> 
    2756 <tr><th>Last name:</th><td><input type="text" name="last_name" /></td></tr> 
    2757 <tr><th>Birthday:</th><td><input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></td></tr> 
     2755<tr><th>First name</th><td><input type="text" name="first_name" /></td></tr> 
     2756<tr><th>Last name</th><td><input type="text" name="last_name" /></td></tr> 
     2757<tr><th>Birthday</th><td><input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></td></tr> 
    27582758>>> print p.as_ul() 
    2759 <li>First name: <input type="text" name="first_name" /></li> 
    2760 <li>Last name: <input type="text" name="last_name" /></li> 
    2761 <li>Birthday: <input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></li> 
     2759<li>First name <input type="text" name="first_name" /></li> 
     2760<li>Last name <input type="text" name="last_name" /></li> 
     2761<li>Birthday <input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></li> 
    27622762>>> print p.as_p() 
    2763 <p>First name: <input type="text" name="first_name" /></p> 
    2764 <p>Last name: <input type="text" name="last_name" /></p> 
    2765 <p>Birthday: <input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></p> 
     2763<p>First name <input type="text" name="first_name" /></p> 
     2764<p>Last name <input type="text" name="last_name" /></p> 
     2765<p>Birthday <input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></p> 
    27662766 
    27672767With auto_id set, a HiddenInput still gets an ID, but it doesn't get a label. 
    27682768>>> p = Person(auto_id='id_%s') 
    27692769>>> print p 
    2770 <tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> 
    2771 <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr> 
    2772 <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></td></tr> 
     2770<tr><th><label for="id_first_name">First name</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> 
     2771<tr><th><label for="id_last_name">Last name</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr> 
     2772<tr><th><label for="id_birthday">Birthday</label></th><td><input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></td></tr> 
    27732773>>> print p.as_ul() 
    2774 <li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li> 
    2775 <li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li> 
    2776 <li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></li> 
     2774<li><label for="id_first_name">First name</label> <input type="text" name="first_name" id="id_first_name" /></li> 
     2775<li><label for="id_last_name">Last name</label> <input type="text" name="last_name" id="id_last_name" /></li> 
     2776<li><label for="id_birthday">Birthday</label> <input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></li> 
    27772777>>> print p.as_p() 
    2778 <p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p> 
    2779 <p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p> 
    2780 <p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></p> 
     2778<p><label for="id_first_name">First name</label> <input type="text" name="first_name" id="id_first_name" /></p> 
     2779<p><label for="id_last_name">Last name</label> <input type="text" name="last_name" id="id_last_name" /></p> 
     2780<p><label for="id_birthday">Birthday</label> <input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></p> 
    27812781 
    27822782If a field with a HiddenInput has errors, the as_table() and as_ul() output 
    27832783will include the error message(s) with the text "(Hidden field [fieldname]) " 
     
    27862786>>> p = Person({'first_name': 'John', 'last_name': 'Lennon', 'birthday': '1940-10-9'}, auto_id=False) 
    27872787>>> print p 
    27882788<tr><td colspan="2"><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></td></tr> 
    2789 <tr><th>First name:</th><td><input type="text" name="first_name" value="John" /></td></tr> 
    2790 <tr><th>Last name:</th><td><input type="text" name="last_name" value="Lennon" /></td></tr> 
    2791 <tr><th>Birthday:</th><td><input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></td></tr> 
     2789<tr><th>First name</th><td><input type="text" name="first_name" value="John" /></td></tr> 
     2790<tr><th>Last name</th><td><input type="text" name="last_name" value="Lennon" /></td></tr> 
     2791<tr><th>Birthday</th><td><input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></td></tr> 
    27922792>>> print p.as_ul() 
    27932793<li><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></li> 
    2794 <li>First name: <input type="text" name="first_name" value="John" /></li> 
    2795 <li>Last name: <input type="text" name="last_name" value="Lennon" /></li> 
    2796 <li>Birthday: <input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></li> 
     2794<li>First name <input type="text" name="first_name" value="John" /></li> 
     2795<li>Last name <input type="text" name="last_name" value="Lennon" /></li> 
     2796<li>Birthday <input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></li> 
    27972797>>> print p.as_p() 
    27982798<ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul> 
    2799 <p>First name: <input type="text" name="first_name" value="John" /></p> 
    2800 <p>Last name: <input type="text" name="last_name" value="Lennon" /></p> 
    2801 <p>Birthday: <input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></p> 
     2799<p>First name <input type="text" name="first_name" value="John" /></p> 
     2800<p>Last name <input type="text" name="last_name" value="Lennon" /></p> 
     2801<p>Birthday <input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></p> 
    28022802 
    28032803A corner case: It's possible for a form to have only HiddenInputs. 
    28042804>>> class TestForm(Form): 
     
    28302830...     field14 = CharField() 
    28312831>>> p = TestForm(auto_id=False) 
    28322832>>> print p 
    2833 <tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr> 
    2834 <tr><th>Field2:</th><td><input type="text" name="field2" /></td></tr> 
    2835 <tr><th>Field3:</th><td><input type="text" name="field3" /></td></tr> 
    2836 <tr><th>Field4:</th><td><input type="text" name="field4" /></td></tr> 
    2837 <tr><th>Field5:</th><td><input type="text" name="field5" /></td></tr> 
    2838 <tr><th>Field6:</th><td><input type="text" name="field6" /></td></tr> 
    2839 <tr><th>Field7:</th><td><input type="text" name="field7" /></td></tr> 
    2840 <tr><th>Field8:</th><td><input type="text" name="field8" /></td></tr> 
    2841 <tr><th>Field9:</th><td><input type="text" name="field9" /></td></tr> 
    2842 <tr><th>Field10:</th><td><input type="text" name="field10" /></td></tr> 
    2843 <tr><th>Field11:</th><td><input type="text" name="field11" /></td></tr> 
    2844 <tr><th>Field12:</th><td><input type="text" name="field12" /></td></tr> 
    2845 <tr><th>Field13:</th><td><input type="text" name="field13" /></td></tr> 
    2846 <tr><th>Field14:</th><td><input type="text" name="field14" /></td></tr> 
     2833<tr><th>Field1</th><td><input type="text" name="field1" /></td></tr> 
     2834<tr><th>Field2</th><td><input type="text" name="field2" /></td></tr> 
     2835<tr><th>Field3</th><td><input type="text" name="field3" /></td></tr> 
     2836<tr><th>Field4</th><td><input type="text" name="field4" /></td></tr> 
     2837<tr><th>Field5</th><td><input type="text" name="field5" /></td></tr> 
     2838<tr><th>Field6</th><td><input type="text" name="field6" /></td></tr> 
     2839<tr><th>Field7</th><td><input type="text" name="field7" /></td></tr> 
     2840<tr><th>Field8</th><td><input type="text" name="field8" /></td></tr> 
     2841<tr><th>Field9</th><td><input type="text" name="field9" /></td></tr> 
     2842<tr><th>Field10</th><td><input type="text" name="field10" /></td></tr> 
     2843<tr><th>Field11</th><td><input type="text" name="field11" /></td></tr> 
     2844<tr><th>Field12</th><td><input type="text" name="field12" /></td></tr> 
     2845<tr><th>Field13</th><td><input type="text" name="field13" /></td></tr> 
     2846<tr><th>Field14</th><td><input type="text" name="field14" /></td></tr> 
    28472847 
    28482848Some Field classes have an effect on the HTML attributes of their associated 
    28492849Widget. If you set max_length in a CharField and its associated widget is 
     
    28562856...    address = CharField()                                 # no max_length defined here 
    28572857>>> p = UserRegistration(auto_id=False) 
    28582858>>> print p.as_ul() 
    2859 <li>Username: <input type="text" name="username" maxlength="10" /></li> 
    2860 <li>Password: <input type="password" name="password" maxlength="10" /></li> 
    2861 <li>Realname: <input type="text" name="realname" maxlength="10" /></li> 
    2862 <li>Address: <input type="text" name="address" /></li> 
     2859<li>Username <input type="text" name="username" maxlength="10" /></li> 
     2860<li>Password <input type="password" name="password" maxlength="10" /></li> 
     2861<li>Realname <input type="text" name="realname" maxlength="10" /></li> 
     2862<li>Address <input type="text" name="address" /></li> 
    28632863 
    28642864If you specify a custom "attrs" that includes the "maxlength" attribute, 
    28652865the Field's max_length attribute will override whatever "maxlength" you specify 
     
    28692869...    password = CharField(max_length=10, widget=PasswordInput) 
    28702870>>> p = UserRegistration(auto_id=False) 
    28712871>>> print p.as_ul() 
    2872 <li>Username: <input type="text" name="username" maxlength="10" /></li> 
    2873 <li>Password: <input type="password" name="password" maxlength="10" /></li> 
     2872<li>Username <input type="text" name="username" maxlength="10" /></li> 
     2873<li>Password <input type="password" name="password" maxlength="10" /></li> 
    28742874 
    28752875# Specifying labels ########################################################### 
    28762876 
     
    28832883...    password2 = CharField(widget=PasswordInput, label='Password (again)') 
    28842884>>> p = UserRegistration(auto_id=False) 
    28852885>>> print p.as_ul() 
    2886 <li>Your username: <input type="text" name="username" maxlength="10" /></li> 
    2887 <li>Password1: <input type="password" name="password1" /></li> 
    2888 <li>Password (again): <input type="password" name="password2" /></li> 
     2886<li>Your username <input type="text" name="username" maxlength="10" /></li> 
     2887<li>Password1 <input type="password" name="password1" /></li> 
     2888<li>Password (again) <input type="password" name="password2" /></li> 
    28892889 
    2890 Labels for as_* methods will only end in a colon if they don't end in other 
     2890Labels for as_* methods will not add a colon to the label, regardless of the last character 
    28912891punctuation already. 
    28922892>>> class Questions(Form): 
    28932893...    q1 = CharField(label='The first question') 
     
    28962896...    q4 = CharField(label='Answer this question!') 
    28972897...    q5 = CharField(label='The last question. Period.') 
    28982898>>> print Questions(auto_id=False).as_p() 
    2899 <p>The first question: <input type="text" name="q1" /></p> 
     2899<p>The first question <input type="text" name="q1" /></p> 
    29002900<p>What is your name? <input type="text" name="q2" /></p> 
    29012901<p>The answer to life is: <input type="text" name="q3" /></p> 
    29022902<p>Answer this question! <input type="text" name="q4" /></p> 
    29032903<p>The last question. Period. <input type="text" name="q5" /></p> 
    29042904>>> print Questions().as_p() 
    2905 <p><label for="id_q1">The first question:</label> <input type="text" name="q1" id="id_q1" /></p> 
     2905<p><label for="id_q1">The first question</label> <input type="text" name="q1" id="id_q1" /></p> 
    29062906<p><label for="id_q2">What is your name?</label> <input type="text" name="q2" id="id_q2" /></p> 
    29072907<p><label for="id_q3">The answer to life is:</label> <input type="text" name="q3" id="id_q3" /></p> 
    29082908<p><label for="id_q4">Answer this question!</label> <input type="text" name="q4" id="id_q4" /></p> 
     
    29142914...    password = CharField(widget=PasswordInput, label=u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111') 
    29152915>>> p = UserRegistration(auto_id=False) 
    29162916>>> p.as_ul() 
    2917 u'<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="text" name="username" maxlength="10" /></li>\n<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="password" name="password" /></li>' 
     2917u'<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111 <input type="text" name="username" maxlength="10" /></li>\n<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111 <input type="password" name="password" /></li>' 
    29182918 
    29192919If a label is set to the empty string for a field, that field won't get a label. 
    29202920>>> class UserRegistration(Form): 
     
    29232923>>> p = UserRegistration(auto_id=False) 
    29242924>>> print p.as_ul() 
    29252925<li> <input type="text" name="username" maxlength="10" /></li> 
    2926 <li>Password: <input type="password" name="password" /></li> 
     2926<li>Password <input type="password" name="password" /></li> 
    29272927>>> p = UserRegistration(auto_id='id_%s') 
    29282928>>> print p.as_ul() 
    29292929<li> <input id="id_username" type="text" name="username" maxlength="10" /></li> 
    2930 <li><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /></li> 
     2930<li><label for="id_password">Password</label> <input type="password" name="password" id="id_password" /></li> 
    29312931 
    29322932If label is None, Django will auto-create the label from the field name. This 
    29332933is default behavior. 
     
    29362936...    password = CharField(widget=PasswordInput) 
    29372937>>> p = UserRegistration(auto_id=False) 
    29382938>>> print p.as_ul() 
    2939 <li>Username: <input type="text" name="username" maxlength="10" /></li> 
    2940 <li>Password: <input type="password" name="password" /></li> 
     2939<li>Username <input type="text" name="username" maxlength="10" /></li> 
     2940<li>Password <input type="password" name="password" /></li> 
    29412941>>> p = UserRegistration(auto_id='id_%s') 
    29422942>>> print p.as_ul() 
    2943 <li><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /></li> 
    2944 <li><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /></li> 
     2943<li><label for="id_username">Username</label> <input id="id_username" type="text" name="username" maxlength="10" /></li> 
     2944<li><label for="id_password">Password</label> <input type="password" name="password" id="id_password" /></li> 
    29452945 
    29462946# Initial data ################################################################ 
    29472947 
     
    29572957Here, we're not submitting any data, so the initial value will be displayed. 
    29582958>>> p = UserRegistration(auto_id=False) 
    29592959>>> print p.as_ul() 
    2960 <li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> 
    2961 <li>Password: <input type="password" name="password" /></li> 
     2960<li>Username <input type="text" name="username" value="django" maxlength="10" /></li> 
     2961<li>Password <input type="password" name="password" /></li> 
    29622962 
    29632963Here, we're submitting data, so the initial value will *not* be displayed. 
    29642964>>> p = UserRegistration({}, auto_id=False) 
    29652965>>> print p.as_ul() 
    2966 <li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> 
    2967 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> 
     2966<li><ul class="errorlist"><li>This field is required.</li></ul>Username <input type="text" name="username" maxlength="10" /></li> 
     2967<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /></li> 
    29682968>>> p = UserRegistration({'username': u''}, auto_id=False) 
    29692969>>> print p.as_ul() 
    2970 <li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> 
    2971 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> 
     2970<li><ul class="errorlist"><li>This field is required.</li></ul>Username <input type="text" name="username" maxlength="10" /></li> 
     2971<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /></li> 
    29722972>>> p = UserRegistration({'username': u'foo'}, auto_id=False) 
    29732973>>> print p.as_ul() 
    2974 <li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li> 
    2975 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> 
     2974<li>Username <input type="text" name="username" value="foo" maxlength="10" /></li> 
     2975<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /></li> 
    29762976 
    29772977An 'initial' value is *not* used as a fallback if data is not provided. In this 
    29782978example, we don't provide a value for 'username', and the form raises a 
     
    29982998Here, we're not submitting any data, so the initial value will be displayed. 
    29992999>>> p = UserRegistration(initial={'username': 'django'}, auto_id=False) 
    30003000>>> print p.as_ul() 
    3001 <li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> 
    3002 <li>Password: <input type="password" name="password" /></li> 
     3001<li>Username <input type="text" name="username" value="django" maxlength="10" /></li> 
     3002<li>Password <input type="password" name="password" /></li> 
    30033003>>> p = UserRegistration(initial={'username': 'stephane'}, auto_id=False) 
    30043004>>> print p.as_ul() 
    3005 <li>Username: <input type="text" name="username" value="stephane" maxlength="10" /></li> 
    3006 <li>Password: <input type="password" name="password" /></li> 
     3005<li>Username <input type="text" name="username" value="stephane" maxlength="10" /></li> 
     3006<li>Password <input type="password" name="password" /></li> 
    30073007 
    30083008The 'initial' parameter is meaningless if you pass data. 
    30093009>>> p = UserRegistration({}, initial={'username': 'django'}, auto_id=False) 
    30103010>>> print p.as_ul() 
    3011 <li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> 
    3012 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> 
     3011<li><ul class="errorlist"><li>This field is required.</li></ul>Username <input type="text" name="username" maxlength="10" /></li> 
     3012<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /></li> 
    30133013>>> p = UserRegistration({'username': u''}, initial={'username': 'django'}, auto_id=False) 
    30143014>>> print p.as_ul() 
    3015 <li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> 
    3016 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> 
     3015<li><ul class="errorlist"><li>This field is required.</li></ul>Username <input type="text" name="username" maxlength="10" /></li> 
     3016<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /></li> 
    30173017>>> p = UserRegistration({'username': u'foo'}, initial={'username': 'django'}, auto_id=False) 
    30183018>>> print p.as_ul() 
    3019 <li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li> 
    3020 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> 
     3019<li>Username <input type="text" name="username" value="foo" maxlength="10" /></li> 
     3020<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /></li> 
    30213021 
    30223022A dynamic 'initial' value is *not* used as a fallback if data is not provided. 
    30233023In this example, we don't provide a value for 'username', and the form raises a 
     
    30353035...    password = CharField(widget=PasswordInput) 
    30363036>>> p = UserRegistration(initial={'username': 'babik'}, auto_id=False) 
    30373037>>> print p.as_ul() 
    3038 <li>Username: <input type="text" name="username" value="babik" maxlength="10" /></li> 
    3039 <li>Password: <input type="password" name="password" /></li> 
     3038<li>Username <input type="text" name="username" value="babik" maxlength="10" /></li> 
     3039<li>Password <input type="password" name="password" /></li> 
    30403040 
    30413041# Callable initial data ######################################################## 
    30423042 
     
    30563056Here, we're not submitting any data, so the initial value will be displayed. 
    30573057>>> p = UserRegistration(initial={'username': initial_django}, auto_id=False) 
    30583058>>> print p.as_ul() 
    3059 <li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> 
    3060 <li>Password: <input type="password" name="password" /></li> 
     3059<li>Username <input type="text" name="username" value="django" maxlength="10" /></li> 
     3060<li>Password <input type="password" name="password" /></li> 
    30613061 
    30623062The 'initial' parameter is meaningless if you pass data. 
    30633063>>> p = UserRegistration({}, initial={'username': initial_django}, auto_id=False) 
    30643064>>> print p.as_ul() 
    3065 <li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> 
    3066 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> 
     3065<li><ul class="errorlist"><li>This field is required.</li></ul>Username <input type="text" name="username" maxlength="10" /></li> 
     3066<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /></li> 
    30673067>>> p = UserRegistration({'username': u''}, initial={'username': initial_django}, auto_id=False) 
    30683068>>> print p.as_ul() 
    3069 <li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> 
    3070 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> 
     3069<li><ul class="errorlist"><li>This field is required.</li></ul>Username <input type="text" name="username" maxlength="10" /></li> 
     3070<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /></li> 
    30713071>>> p = UserRegistration({'username': u'foo'}, initial={'username': initial_django}, auto_id=False) 
    30723072>>> print p.as_ul() 
    3073 <li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li> 
    3074 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> 
     3073<li>Username <input type="text" name="username" value="foo" maxlength="10" /></li> 
     3074<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /></li> 
    30753075 
    30763076A callable 'initial' value is *not* used as a fallback if data is not provided. 
    30773077In this example, we don't provide a value for 'username', and the form raises a 
     
    30893089...    password = CharField(widget=PasswordInput) 
    30903090>>> p = UserRegistration(auto_id=False) 
    30913091>>> print p.as_ul() 
    3092 <li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> 
    3093 <li>Password: <input type="password" name="password" /></li> 
     3092<li>Username <input type="text" name="username" value="django" maxlength="10" /></li> 
     3093<li>Password <input type="password" name="password" /></li> 
    30943094>>> p = UserRegistration(initial={'username': initial_stephane}, auto_id=False) 
    30953095>>> print p.as_ul() 
    3096 <li>Username: <input type="text" name="username" value="stephane" maxlength="10" /></li> 
    3097 <li>Password: <input type="password" name="password" /></li> 
     3096<li>Username <input type="text" name="username" value="stephane" maxlength="10" /></li> 
     3097<li>Password <input type="password" name="password" /></li> 
    30983098 
    30993099# Help text ################################################################### 
    31003100 
     
    31053105...    password = CharField(widget=PasswordInput, help_text='Choose wisely.') 
    31063106>>> p = UserRegistration(auto_id=False) 
    31073107>>> print p.as_ul() 
    3108 <li>Username: <input type="text" name="username" maxlength="10" /> e.g., user@example.com</li> 
    3109 <li>Password: <input type="password" name="password" /> Choose wisely.</li> 
     3108<li>Username <input type="text" name="username" maxlength="10" /> e.g., user@example.com</li> 
     3109<li>Password <input type="password" name="password" /> Choose wisely.</li> 
    31103110>>> print p.as_p() 
    3111 <p>Username: <input type="text" name="username" maxlength="10" /> e.g., user@example.com</p> 
    3112 <p>Password: <input type="password" name="password" /> Choose wisely.</p> 
     3111<p>Username <input type="text" name="username" maxlength="10" /> e.g., user@example.com</p> 
     3112<p>Password <input type="password" name="password" /> Choose wisely.</p> 
    31133113>>> print p.as_table() 
    3114 <tr><th>Username:</th><td><input type="text" name="username" maxlength="10" /><br />e.g., user@example.com</td></tr> 
    3115 <tr><th>Password:</th><td><input type="password" name="password" /><br />Choose wisely.</td></tr> 
     3114<tr><th>Username</th><td><input type="text" name="username" maxlength="10" /><br />e.g., user@example.com</td></tr> 
     3115<tr><th>Password</th><td><input type="password" name="password" /><br />Choose wisely.</td></tr> 
    31163116 
    31173117The help text is displayed whether or not data is provided for the form. 
    31183118>>> p = UserRegistration({'username': u'foo'}, auto_id=False) 
    31193119>>> print p.as_ul() 
    3120 <li>Username: <input type="text" name="username" value="foo" maxlength="10" /> e.g., user@example.com</li> 
    3121 <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /> Choose wisely.</li> 
     3120<li>Username <input type="text" name="username" value="foo" maxlength="10" /> e.g., user@example.com</li> 
     3121<li><ul class="errorlist"><li>This field is required.</li></ul>Password <input type="password" name="password" /> Choose wisely.</li> 
    31223122 
    31233123help_text is not displayed for hidden fields. It can be used for documentation 
    31243124purposes, though. 
     
    31283128...    next = CharField(widget=HiddenInput, initial='/', help_text='Redirect destination') 
    31293129>>> p = UserRegistration(auto_id=False) 
    31303130>>> print p.as_ul() 
    3131 <li>Username: <input type="text" name="username" maxlength="10" /> e.g., user@example.com</li> 
    3132 <li>Password: <input type="password" name="password" /><input type="hidden" name="next" value="/" /></li> 
     3131<li>Username <input type="text" name="username" maxlength="10" /> e.g., user@example.com</li> 
     3132<li>Password <input type="password" name="password" /><input type="hidden" name="next" value="/" /></li> 
    31333133 
    31343134Help text can include arbitrary Unicode characters. 
    31353135>>> class UserRegistration(Form): 
    31363136...    username = CharField(max_length=10, help_text='ŠĐĆŽćžšđ') 
    31373137>>> p = UserRegistration(auto_id=False) 
    31383138>>> p.as_ul() 
    3139 u'<li>Username: <input type="text" name="username" maxlength="10" /> \u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</li>' 
     3139u'<li>Username <input type="text" name="username" maxlength="10" /> \u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</li>' 
    31403140 
    31413141# Subclassing forms ########################################################### 
    31423142 
     
    31513151...     instrument = CharField() 
    31523152>>> p = Person(auto_id=False) 
    31533153>>> print p.as_ul() 
    3154 <li>First name: <input type="text" name="first_name" /></li> 
    3155 <li>Last name: <input type="text" name="last_name" /></li> 
    3156 <li>Birthday: <input type="text" name="birthday" /></li> 
     3154<li>First name <input type="text" name="first_name" /></li> 
     3155<li>Last name <input type="text" name="last_name" /></li> 
     3156<li>Birthday <input type="text" name="birthday" /></li> 
    31573157>>> m = Musician(auto_id=False) 
    31583158>>> print m.as_ul() 
    3159 <li>First name: <input type="text" name="first_name" /></li> 
    3160 <li>Last name: <input type="text" name="last_name" /></li> 
    3161 <li>Birthday: <input type="text" name="birthday" /></li> 
    3162 <li>Instrument: <input type="text" name="instrument" /></li> 
     3159<li>First name <input type="text" name="first_name" /></li> 
     3160<li>Last name <input type="text" name="last_name" /></li> 
     3161<li>Birthday <input type="text" name="birthday" /></li> 
     3162<li>Instrument <input type="text" name="instrument" /></li> 
    31633163 
    31643164Yes, you can subclass multiple forms. The fields are added in the order in 
    31653165which the parent classes are listed. 
     
    31733173...     haircut_type = CharField() 
    31743174>>> b = Beatle(auto_id=False) 
    31753175>>> print b.as_ul() 
    3176 <li>First name: <input type="text" name="first_name" /></li> 
    3177 <li>Last name: <input type="text" name="last_name" /></li> 
    3178 <li>Birthday: <input type="text" name="birthday" /></li> 
    3179 <li>Instrument: <input type="text" name="instrument" /></li> 
    3180 <li>Haircut type: <input type="text" name="haircut_type" /></li> 
     3176<li>First name <input type="text" name="first_name" /></li> 
     3177<li>Last name <input type="text" name="last_name" /></li> 
     3178<li>Birthday <input type="text" name="birthday" /></li> 
     3179<li>Instrument <input type="text" name="instrument" /></li> 
     3180<li>Haircut type <input type="text" name="haircut_type" /></li> 
    31813181 
    31823182# Forms with prefixes ######################################################### 
    31833183 
     
    31993199... } 
    32003200>>> p = Person(data, prefix='person1') 
    32013201>>> print p.as_ul() 
    3202 <li><label for="id_person1-first_name">First name:</label> <input type="text" name="person1-first_name" value="John" id="id_person1-first_name" /></li> 
    3203 <li><label for="id_person1-last_name">Last name:</label> <input type="text" name="person1-last_name" value="Lennon" id="id_person1-last_name" /></li> 
    3204 <li><label for="id_person1-birthday">Birthday:</label> <input type="text" name="person1-birthday" value="1940-10-9" id="id_person1-birthday" /></li> 
     3202<li><label for="id_person1-first_name">First name</label> <input type="text" name="person1-first_name" value="John" id="id_person1-first_name" /></li> 
     3203<li><label for="id_person1-last_name">Last name</label> <input type="text" name="person1-last_name" value="Lennon" id="id_person1-last_name" /></li> 
     3204<li><label for="id_person1-birthday">Birthday</label> <input type="text" name="person1-birthday" value="1940-10-9" id="id_person1-birthday" /></li> 
    32053205>>> print p['first_name'] 
    32063206<input type="text" name="person1-first_name" value="John" id="id_person1-first_name" /> 
    32073207>>> print p['last_name'] 
     
    32763276...         return self.prefix and '%s-prefix-%s' % (self.prefix, field_name) or field_name 
    32773277>>> p = Person(prefix='foo') 
    32783278>>> print p.as_ul() 
    3279 <li><label for="id_foo-prefix-first_name">First name:</label> <input type="text" name="foo-prefix-first_name" id="id_foo-prefix-first_name" /></li> 
    3280 <li><label for="id_foo-prefix-last_name">Last name:</label> <input type="text" name="foo-prefix-last_name" id="id_foo-prefix-last_name" /></li> 
    3281 <li><label for="id_foo-prefix-birthday">Birthday:</label> <input type="text" name="foo-prefix-birthday" id="id_foo-prefix-birthday" /></li> 
     3279<li><label for="id_foo-prefix-first_name">First name</label> <input type="text" name="foo-prefix-first_name" id="id_foo-prefix-first_name" /></li> 
     3280<li><label for="id_foo-prefix-last_name">Last name</label> <input type="text" name="foo-prefix-last_name" id="id_foo-prefix-last_name" /></li> 
     3281<li><label for="id_foo-prefix-birthday">Birthday</label> <input type="text" name="foo-prefix-birthday" id="id_foo-prefix-birthday" /></li> 
    32823282>>> data = { 
    32833283...     'foo-prefix-first_name': u'John', 
    32843284...     'foo-prefix-last_name': u'Lennon', 
     
    33503350...     file1 = FileField() 
    33513351>>> f = FileForm(auto_id=False) 
    33523352>>> print f 
    3353 <tr><th>File1:</th><td><input type="file" name="file1" /></td></tr> 
     3353<tr><th>File1</th><td><input type="file" name="file1" /></td></tr> 
    33543354 
    33553355>>> f = FileForm(data={}, files={}, auto_id=False) 
    33563356>>> print f 
    3357 <tr><th>File1:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="file" name="file1" /></td></tr> 
     3357<tr><th>File1</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="file" name="file1" /></td></tr> 
    33583358 
    33593359>>> f = FileForm(data={}, files={'file1': {'filename': 'name', 'content':''}}, auto_id=False) 
    33603360>>> print f 
    3361 <tr><th>File1:</th><td><ul class="errorlist"><li>The submitted file is empty.</li></ul><input type="file" name="file1" /></td></tr> 
     3361<tr><th>File1</th><td><ul class="errorlist"><li>The submitted file is empty.</li></ul><input type="file" name="file1" /></td></tr> 
    33623362 
    33633363>>> f = FileForm(data={}, files={'file1': 'something that is not a file'}, auto_id=False) 
    33643364>>> print f 
    3365 <tr><th>File1:</th><td><ul class="errorlist"><li>No file was submitted. Check the encoding type on the form.</li></ul><input type="file" name="file1" /></td></tr> 
     3365<tr><th>File1</th><td><ul class="errorlist"><li>No file was submitted. Check the encoding type on the form.</li></ul><input type="file" name="file1" /></td></tr> 
    33663366 
    33673367>>> f = FileForm(data={}, files={'file1': {'filename': 'name', 'content':'some content'}}, auto_id=False) 
    33683368>>> print f 
    3369 <tr><th>File1:</th><td><input type="file" name="file1" /></td></tr> 
     3369<tr><th>File1</th><td><input type="file" name="file1" /></td></tr> 
    33703370>>> f.is_valid() 
    33713371True 
    33723372 
     
    33953395>>> print my_function('GET', {}) 
    33963396<form action="" method="post"> 
    33973397<table> 
    3398 <tr><th>Username:</th><td><input type="text" name="username" maxlength="10" /></td></tr> 
    3399 <tr><th>Password1:</th><td><input type="password" name="password1" /></td></tr> 
    3400 <tr><th>Password2:</th><td><input type="password" name="password2" /></td></tr> 
     3398<tr><th>Username</th><td><input type="text" name="username" maxlength="10" /></td></tr> 
     3399<tr><th>Password1</th><td><input type="password" name="password1" /></td></tr> 
     3400<tr><th>Password2</th><td><input type="password" name="password2" /></td></tr> 
    34013401</table> 
    34023402<input type="submit" /> 
    34033403</form> 
     
    34073407<form action="" method="post"> 
    34083408<table> 
    34093409<tr><td colspan="2"><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></td></tr> 
    3410 <tr><th>Username:</th><td><ul class="errorlist"><li>Ensure this value has at most 10 characters (it has 23).</li></ul><input type="text" name="username" value="this-is-a-long-username" maxlength="10" /></td></tr> 
    3411 <tr><th>Password1:</th><td><input type="password" name="password1" value="foo" /></td></tr> 
    3412 <tr><th>Password2:</th><td><input type="password" name="password2" value="bar" /></td></tr> 
     3410<tr><th>Username</th><td><ul class="errorlist"><li>Ensure this value has at most 10 characters (it has 23).</li></ul><input type="text" name="username" value="this-is-a-long-username" maxlength="10" /></td></tr> 
     3411<tr><th>Password1</th><td><input type="password" name="password1" value="foo" /></td></tr> 
     3412<tr><th>Password2</th><td><input type="password" name="password2" value="bar" /></td></tr> 
    34133413</table> 
    34143414<input type="submit" /> 
    34153415</form> 
     
    34353435displaying all the errors, including any that might not be associated with a 
    34363436particular field. 
    34373437>>> t = Template('''<form action=""> 
    3438 ... {{ form.username.errors.as_ul }}<p><label>Your username: {{ form.username }}</label></p> 
    3439 ... {{ form.password1.errors.as_ul }}<p><label>Password: {{ form.password1 }}</label></p> 
    3440 ... {{ form.password2.errors.as_ul }}<p><label>Password (again): {{ form.password2 }}</label></p> 
     3438... {{ form.username.errors.as_ul }}<p><label>Your username {{ form.username }}</label></p> 
     3439... {{ form.password1.errors.as_ul }}<p><label>Password {{ form.password1 }}</label></p> 
     3440... {{ form.password2.errors.as_ul }}<p><label>Password (again) {{ form.password2 }}</label></p> 
    34413441... <input type="submit" /> 
    34423442... </form>''') 
    34433443>>> print t.render(Context({'form': UserRegistration(auto_id=False)})) 
    34443444<form action=""> 
    3445 <p><label>Your username: <input type="text" name="username" maxlength="10" /></label></p> 
    3446 <p><label>Password: <input type="password" name="password1" /></label></p> 
    3447 <p><label>Password (again): <input type="password" name="password2" /></label></p> 
     3445<p><label>Your username <input type="text" name="username" maxlength="10" /></label></p> 
     3446<p><label>Password <input type="password" name="password1" /></label></p> 
     3447<p><label>Password (again) <input type="password" name="password2" /></label></p> 
    34483448<input type="submit" /> 
    34493449</form> 
    34503450>>> print t.render(Context({'form': UserRegistration({'username': 'django'}, auto_id=False)})) 
    34513451<form action=""> 
    3452 <p><label>Your username: <input type="text" name="username" value="django" maxlength="10" /></label></p> 
    3453 <ul class="errorlist"><li>This field is required.</li></ul><p><label>Password: <input type="password" name="password1" /></label></p> 
    3454 <ul class="errorlist"><li>This field is required.</li></ul><p><label>Password (again): <input type="password" name="password2" /></label></p> 
     3452<p><label>Your username <input type="text" name="username" value="django" maxlength="10" /></label></p> 
     3453<ul class="errorlist"><li>This field is required.</li></ul><p><label>Password <input type="password" name="password1" /></label></p> 
     3454<ul class="errorlist"><li>This field is required.</li></ul><p><label>Password (again) <input type="password" name="password2" /></label></p> 
    34553455<input type="submit" /> 
    34563456</form> 
    34573457 
     
    34603460'label', Django will use the field name with underscores converted to spaces, 
    34613461and the initial letter capitalized. 
    34623462>>> t = Template('''<form action=""> 
    3463 ... <p><label>{{ form.username.label }}: {{ form.username }}</label></p> 
    3464 ... <p><label>{{ form.password1.label }}: {{ form.password1 }}</label></p> 
    3465 ... <p><label>{{ form.password2.label }}: {{ form.password2 }}</label></p> 
     3463... <p><label>{{ form.username.label }} {{ form.username }}</label></p> 
     3464... <p><label>{{ form.password1.label }} {{ form.password1 }}</label></p> 
     3465... <p><label>{{ form.password2.label }} {{ form.password2 }}</label></p> 
    34663466... <input type="submit" /> 
    34673467... </form>''') 
    34683468>>> print t.render(Context({'form': UserRegistration(auto_id=False)})) 
    34693469<form action=""> 
    3470 <p><label>Username: <input type="text" name="username" maxlength="10" /></label></p> 
    3471 <p><label>Password1: <input type="password" name="password1" /></label></p> 
    3472 <p><label>Password2: <input type="password" name="password2" /></label></p> 
     3470<p><label>Username <input type="text" name="username" maxlength="10" /></label></p> 
     3471<p><label>Password1 <input type="password" name="password1" /></label></p> 
     3472<p><label>Password2 <input type="password" name="password2" /></label></p> 
    34733473<input type="submit" /> 
    34743474</form> 
    34753475 
     
    34783478Recall from above that passing the "auto_id" argument to a Form gives each 
    34793479field an "id" attribute. 
    34803480>>> t = Template('''<form action=""> 
    3481 ... <p>{{ form.username.label_tag }}: {{ form.username }}</p> 
    3482 ... <p>{{ form.password1.label_tag }}: {{ form.password1 }}</p> 
    3483 ... <p>{{ form.password2.label_tag }}: {{ form.password2 }}</p> 
     3481... <p>{{ form.username.label_tag }} {{ form.username }}</p> 
     3482... <p>{{ form.password1.label_tag }} {{ form.password1 }}</p> 
     3483... <p>{{ form.password2.label_tag }} {{ form.password2 }}</p> 
    34843484... <input type="submit" /> 
    34853485... </form>''') 
    34863486>>> print t.render(Context({'form': UserRegistration(auto_id=False)})) 
    34873487<form action=""> 
    3488 <p>Username: <input type="text" name="username" maxlength="10" /></p> 
    3489 <p>Password1: <input type="password" name="password1" /></p> 
    3490 <p>Password2: <input type="password" name="password2" /></p> 
     3488<p>Username <input type="text" name="username" maxlength="10" /></p> 
     3489<p>Password1 <input type="password" name="password1" /></p> 
     3490<p>Password2 <input type="password" name="password2" /></p> 
    34913491<input type="submit" /> 
    34923492</form> 
    34933493>>> print t.render(Context({'form': UserRegistration(auto_id='id_%s')})) 
    34943494<form action=""> 
    3495 <p><label for="id_username">Username</label>: <input id="id_username" type="text" name="username" maxlength="10" /></p> 
    3496 <p><label for="id_password1">Password1</label>: <input type="password" name="password1" id="id_password1" /></p> 
    3497 <p><label for="id_password2">Password2</label>: <input type="password" name="password2" id="id_password2" /></p> 
     3495<p><label for="id_username">Username</label> <input id="id_username" type="text" name="username" maxlength="10" /></p> 
     3496<p><label for="id_password1">Password1</label> <input type="password" name="password1" id="id_password1" /></p> 
     3497<p><label for="id_password2">Password2</label> <input type="password" name="password2" id="id_password2" /></p> 
    34983498<input type="submit" /> 
    34993499</form> 
    35003500 
    35013501User form.[field].help_text to output a field's help text. If the given field 
    35023502does not have help text, nothing will be output. 
    35033503>>> t = Template('''<form action=""> 
    3504 ... <p>{{ form.username.label_tag }}: {{ form.username }}<br />{{ form.username.help_text }}</p> 
    3505 ... <p>{{ form.password1.label_tag }}: {{ form.password1 }}</p> 
    3506 ... <p>{{ form.password2.label_tag }}: {{ form.password2 }}</p> 
     3504... <p>{{ form.username.label_tag }} {{ form.username }}<br />{{ form.username.help_text }}</p> 
     3505... <p>{{ form.password1.label_tag }} {{ form.password1 }}</p> 
     3506... <p>{{ form.password2.label_tag }} {{ form.password2 }}</p> 
    35073507... <input type="submit" /> 
    35083508... </form>''') 
    35093509>>> print t.render(Context({'form': UserRegistration(auto_id=False)})) 
    35103510<form action=""> 
    3511 <p>Username: <input type="text" name="username" maxlength="10" /><br />Good luck picking a username that doesn't already exist.</p> 
    3512 <p>Password1: <input type="password" name="password1" /></p> 
    3513 <p>Password2: <input type="password" name="password2" /></p> 
     3511<p>Username <input type="text" name="username" maxlength="10" /><br />Good luck picking a username that doesn't already exist.</p> 
     3512<p>Password1 <input type="password" name="password1" /></p> 
     3513<p>Password2 <input type="password" name="password2" /></p> 
    35143514<input type="submit" /> 
    35153515</form> 
    35163516>>> Template('{{ form.password1.help_text }}').render(Context({'form': UserRegistration(auto_id=False)})) 
     
    35303530template. If used on its own, it is displayed as a <ul> (or an empty string, if 
    35313531the list of errors is empty). You can also use it in {% if %} statements. 
    35323532>>> t = Template('''<form action=""> 
    3533 ... {{ form.username.errors.as_ul }}<p><label>Your username: {{ form.username }}</label></p> 
    3534 ... {{ form.password1.errors.as_ul }}<p><label>Password: {{ form.password1 }}</label></p> 
    3535 ... {{ form.password2.errors.as_ul }}<p><label>Password (again): {{ form.password2 }}</label></p> 
     3533... {{ form.username.errors.as_ul }}<p><label>Your username {{ form.username }}</label></p> 
     3534... {{ form.password1.errors.as_ul }}<p><label>Password {{ form.password1 }}</label></p> 
     3535... {{ form.password2.errors.as_ul }}<p><label>Password (again) {{ form.password2 }}</label></p> 
    35363536... <input type="submit" /> 
    35373537... </form>''') 
    35383538>>> print t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)})) 
    35393539<form action=""> 
    3540 <p><label>Your username: <input type="text" name="username" value="django" maxlength="10" /></label></p> 
    3541 <p><label>Password: <input type="password" name="password1" value="foo" /></label></p> 
    3542 <p><label>Password (again): <input type="password" name="password2" value="bar" /></label></p> 
     3540<p><label>Your username <input type="text" name="username" value="django" maxlength="10" /></label></p> 
     3541<p><label>Password <input type="password" name="password1" value="foo" /></label></p> 
     3542<p><label>Password (again) <input type="password" name="password2" value="bar" /></label></p> 
    35433543<input type="submit" /> 
    35443544</form> 
    35453545>>> t = Template('''<form action=""> 
    35463546... {{ form.non_field_errors }} 
    3547 ... {{ form.username.errors.as_ul }}<p><label>Your username: {{ form.username }}</label></p> 
    3548 ... {{ form.password1.errors.as_ul }}<p><label>Password: {{ form.password1 }}</label></p> 
    3549 ... {{ form.password2.errors.as_ul }}<p><label>Password (again): {{ form.password2 }}</label></p> 
     3547... {{ form.username.errors.as_ul }}<p><label>Your username {{ form.username }}</label></p> 
     3548... {{ form.password1.errors.as_ul }}<p><label>Password {{ form.password1 }}</label></p> 
     3549... {{ form.password2.errors.as_ul }}<p><label>Password (again) {{ form.password2 }}</label></p> 
    35503550... <input type="submit" /> 
    35513551... </form>''') 
    35523552>>> print t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)})) 
    35533553<form action=""> 
    35543554<ul class="errorlist"><li>Please make sure your passwords match.</li></ul> 
    3555 <p><label>Your username: <input type="text" name="username" value="django" maxlength="10" /></label></p> 
    3556 <p><label>Password: <input type="password" name="password1" value="foo" /></label></p> 
    3557 <p><label>Password (again): <input type="password" name="password2" value="bar" /></label></p> 
     3555<p><label>Your username <input type="text" name="username" value="django" maxlength="10" /></label></p> 
     3556<p><label>Password <input type="password" name="password1" value="foo" /></label></p> 
     3557<p><label>Password (again) <input type="password" name="password2" value="bar" /></label></p> 
    35583558<input type="submit" /> 
    35593559</form> 
    35603560 
     
    37803780...     field1 = ComplexField(widget=w) 
    37813781>>> f = ComplexFieldForm() 
    37823782>>> print f 
    3783 <tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" id="id_field1_0" /> 
     3783<tr><th><label for="id_field1_0">Field1</label></th><td><input type="text" name="field1_0" id="id_field1_0" /> 
    37843784<select multiple="multiple" name="field1_1" id="id_field1_1"> 
    37853785<option value="J">John</option> 
    37863786<option value="P">Paul</option> 
     
    37913791 
    37923792>>> f = ComplexFieldForm({'field1_0':'some text','field1_1':['J','P'], 'field1_2_0':'2007-04-25', 'field1_2_1':'06:24:00'}) 
    37933793>>> print f 
    3794 <tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" value="some text" id="id_field1_0" /> 
     3794<tr><th><label for="id_field1_0">Field1</label></th><td><input type="text" name="field1_0" value="some text" id="id_field1_0" /> 
    37953795<select multiple="multiple" name="field1_1" id="id_field1_1"> 
    37963796<option value="J" selected="selected">John</option> 
    37973797<option value="P" selected="selected">Paul</option> 
     
    38643864>>> data = dict(email='invalid') 
    38653865>>> f = CommentForm(data, auto_id=False, error_class=DivErrorList) 
    38663866>>> print f.as_p() 
    3867 <p>Name: <input type="text" name="name" maxlength="50" /></p> 
     3867<p>Name <input type="text" name="name" maxlength="50" /></p> 
    38683868<div class="errorlist"><div class="error">Enter a valid e-mail address.</div></div> 
    3869 <p>Email: <input type="text" name="email" value="invalid" /></p> 
     3869<p>Email <input type="text" name="email" value="invalid" /></p> 
    38703870<div class="errorlist"><div class="error">This field is required.</div></div> 
    3871 <p>Comment: <input type="text" name="comment" /></p> 
     3871<p>Comment <input type="text" name="comment" /></p> 
    38723872 
    38733873################################# 
    38743874# Test multipart-encoded form # 
  • tests/regressiontests/forms/regressions.py

    old new  
    99...     f1 = CharField(max_length=10, widget=TextInput(attrs=extra_attrs)) 
    1010...     f2 = CharField(widget=TextInput(attrs=extra_attrs)) 
    1111>>> TestForm(auto_id=False).as_p() 
    12 u'<p>F1: <input type="text" class="special" name="f1" maxlength="10" /></p>\n<p>F2: <input type="text" class="special" name="f2" /></p>' 
     12u'<p>F1 <input type="text" class="special" name="f1" maxlength="10" /></p>\n<p>F2 <input type="text" class="special" name="f2" /></p>' 
    1313 
    1414####################### 
    1515# Tests for form i18n # 
     
    2121...     username = CharField(max_length=10, label=ugettext_lazy('Username')) 
    2222>>> f = SomeForm() 
    2323>>> print f.as_p() 
    24 <p><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p> 
     24<p><label for="id_username">Username</label> <input id="id_username" type="text" name="username" maxlength="10" /></p> 
    2525 
    2626Translations are done at rendering time, so multi-lingual apps can define forms 
    2727early and still send back the right translation. 
     
    2929# XFAIL 
    3030>>> activate('de') 
    3131>>> print f.as_p() 
    32 <p><label for="id_username">Benutzername:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p> 
     32<p><label for="id_username">Benutzername</label> <input id="id_username" type="text" name="username" maxlength="10" /></p> 
    3333>>> activate('pl') 
    3434>>> f.as_p() 
    35 u'<p><label for="id_username">Nazwa u\u017cytkownika:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>' 
     35u'<p><label for="id_username">Nazwa u\u017cytkownika</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>' 
    3636>>> deactivate() 
    3737 
    3838Unicode decoding problems... 
     
    4141...     somechoice = ChoiceField(choices=GENDERS, widget=RadioSelect(), label=u'\xc5\xf8\xdf') 
    4242>>> f = SomeForm() 
    4343>>> f.as_p() 
    44 u'<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>' 
     44u'<p><label for="id_somechoice_0">\xc5\xf8\xdf</label> <ul>\n<li><label><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>' 
    4545 
    4646Testing choice validation with UTF-8 bytestrings as input (these are the 
    4747Russian abbreviations "мес." and "шт.". 
     
    5757>>> activate('ru') 
    5858>>> f = SomeForm({}) 
    5959>>> f.as_p() 
    60 u'<ul class="errorlist"><li>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.</li></ul>\n<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>' 
     60u'<ul class="errorlist"><li>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.</li></ul>\n<p><label for="id_somechoice_0">\xc5\xf8\xdf</label> <ul>\n<li><label><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>' 
    6161>>> deactivate() 
    6262 
    6363Deep copying translated text shouldn't raise an error