From 05588b379748888161dbc4486ec076eb3c53b66a Mon Sep 17 00:00:00 2001
From: Adrian Holovaty <adrian@holovaty.com>
Date: Mon, 11 Dec 2006 02:38:18 +0000
Subject: [PATCH] newforms: Changed Form to use auto_id by default

git-svn-id: http://code.djangoproject.com/svn/django/trunk@4192 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 django/newforms/forms.py             |   2 +-
 tests/regressiontests/forms/tests.py | 184 +++++++++++++--------------
 2 files changed, 93 insertions(+), 93 deletions(-)

diff --git a/django/newforms/forms.py b/django/newforms/forms.py
index 9f855dc4f5..feef889d83 100644
--- a/django/newforms/forms.py
+++ b/django/newforms/forms.py
@@ -36,7 +36,7 @@ class Form(StrAndUnicode):
     "A collection of Fields, plus their associated data."
     __metaclass__ = DeclarativeFieldsMetaclass
 
-    def __init__(self, data=None, auto_id=False): # TODO: prefix stuff
+    def __init__(self, data=None, auto_id='id_%s'): # TODO: prefix stuff
         self.ignore_errors = data is None
         self.data = data or {}
         self.auto_id = auto_id
diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py
index e362dee671..8b71bf6adc 100644
--- a/tests/regressiontests/forms/tests.py
+++ b/tests/regressiontests/forms/tests.py
@@ -1327,25 +1327,25 @@ u''
 >>> p.clean_data
 {'first_name': u'John', 'last_name': u'Lennon', 'birthday': datetime.date(1940, 10, 9)}
 >>> print p['first_name']
-<input type="text" name="first_name" value="John" />
+<input type="text" name="first_name" value="John" id="id_first_name" />
 >>> print p['last_name']
-<input type="text" name="last_name" value="Lennon" />
+<input type="text" name="last_name" value="Lennon" id="id_last_name" />
 >>> print p['birthday']
-<input type="text" name="birthday" value="1940-10-9" />
+<input type="text" name="birthday" value="1940-10-9" id="id_birthday" />
 >>> for boundfield in p:
 ...     print boundfield
-<input type="text" name="first_name" value="John" />
-<input type="text" name="last_name" value="Lennon" />
-<input type="text" name="birthday" value="1940-10-9" />
+<input type="text" name="first_name" value="John" id="id_first_name" />
+<input type="text" name="last_name" value="Lennon" id="id_last_name" />
+<input type="text" name="birthday" value="1940-10-9" id="id_birthday" />
 >>> for boundfield in p:
 ...     print boundfield.label, boundfield.data
 First name John
 Last name Lennon
 Birthday 1940-10-9
 >>> print p
-<tr><td>First name:</td><td><input type="text" name="first_name" value="John" /></td></tr>
-<tr><td>Last name:</td><td><input type="text" name="last_name" value="Lennon" /></td></tr>
-<tr><td>Birthday:</td><td><input type="text" name="birthday" value="1940-10-9" /></td></tr>
+<tr><td><label for="id_first_name">First name:</label></td><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr>
+<tr><td><label for="id_last_name">Last name:</label></td><td><input type="text" name="last_name" value="Lennon" id="id_last_name" /></td></tr>
+<tr><td><label for="id_birthday">Birthday:</label></td><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr>
 
 Empty dictionaries are valid, too.
 >>> p = Person({})
@@ -1355,29 +1355,29 @@ Empty dictionaries are valid, too.
 False
 >>> print p
 <tr><td colspan="2"><ul class="errorlist"><li>This field is required.</li></ul></td></tr>
-<tr><td>First name:</td><td><input type="text" name="first_name" /></td></tr>
+<tr><td><label for="id_first_name">First name:</label></td><td><input type="text" name="first_name" id="id_first_name" /></td></tr>
 <tr><td colspan="2"><ul class="errorlist"><li>This field is required.</li></ul></td></tr>
-<tr><td>Last name:</td><td><input type="text" name="last_name" /></td></tr>
+<tr><td><label for="id_last_name">Last name:</label></td><td><input type="text" name="last_name" id="id_last_name" /></td></tr>
 <tr><td colspan="2"><ul class="errorlist"><li>This field is required.</li></ul></td></tr>
-<tr><td>Birthday:</td><td><input type="text" name="birthday" /></td></tr>
+<tr><td><label for="id_birthday">Birthday:</label></td><td><input type="text" name="birthday" id="id_birthday" /></td></tr>
 >>> print p.as_table()
 <tr><td colspan="2"><ul class="errorlist"><li>This field is required.</li></ul></td></tr>
-<tr><td>First name:</td><td><input type="text" name="first_name" /></td></tr>
+<tr><td><label for="id_first_name">First name:</label></td><td><input type="text" name="first_name" id="id_first_name" /></td></tr>
 <tr><td colspan="2"><ul class="errorlist"><li>This field is required.</li></ul></td></tr>
-<tr><td>Last name:</td><td><input type="text" name="last_name" /></td></tr>
+<tr><td><label for="id_last_name">Last name:</label></td><td><input type="text" name="last_name" id="id_last_name" /></td></tr>
 <tr><td colspan="2"><ul class="errorlist"><li>This field is required.</li></ul></td></tr>
-<tr><td>Birthday:</td><td><input type="text" name="birthday" /></td></tr>
+<tr><td><label for="id_birthday">Birthday:</label></td><td><input type="text" name="birthday" id="id_birthday" /></td></tr>
 >>> print p.as_ul()
-<li><ul class="errorlist"><li>This field is required.</li></ul>First name: <input type="text" name="first_name" /></li>
-<li><ul class="errorlist"><li>This field is required.</li></ul>Last name: <input type="text" name="last_name" /></li>
-<li><ul class="errorlist"><li>This field is required.</li></ul>Birthday: <input type="text" name="birthday" /></li>
+<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>
+<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>
+<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>
 >>> print p.as_p()
 <p><ul class="errorlist"><li>This field is required.</li></ul></p>
-<p>First name: <input type="text" name="first_name" /></p>
+<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p>
 <p><ul class="errorlist"><li>This field is required.</li></ul></p>
-<p>Last name: <input type="text" name="last_name" /></p>
+<p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p>
 <p><ul class="errorlist"><li>This field is required.</li></ul></p>
-<p>Birthday: <input type="text" name="birthday" /></p>
+<p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></p>
 
 If you don't pass any values to the Form's __init__(), or if you pass None,
 the Form won't do any validation. Form.errors will be an empty dictionary *but*
@@ -1388,30 +1388,30 @@ Form.is_valid() will return False.
 >>> p.is_valid()
 False
 >>> print p
-<tr><td>First name:</td><td><input type="text" name="first_name" /></td></tr>
-<tr><td>Last name:</td><td><input type="text" name="last_name" /></td></tr>
-<tr><td>Birthday:</td><td><input type="text" name="birthday" /></td></tr>
+<tr><td><label for="id_first_name">First name:</label></td><td><input type="text" name="first_name" id="id_first_name" /></td></tr>
+<tr><td><label for="id_last_name">Last name:</label></td><td><input type="text" name="last_name" id="id_last_name" /></td></tr>
+<tr><td><label for="id_birthday">Birthday:</label></td><td><input type="text" name="birthday" id="id_birthday" /></td></tr>
 >>> print p.as_table()
-<tr><td>First name:</td><td><input type="text" name="first_name" /></td></tr>
-<tr><td>Last name:</td><td><input type="text" name="last_name" /></td></tr>
-<tr><td>Birthday:</td><td><input type="text" name="birthday" /></td></tr>
+<tr><td><label for="id_first_name">First name:</label></td><td><input type="text" name="first_name" id="id_first_name" /></td></tr>
+<tr><td><label for="id_last_name">Last name:</label></td><td><input type="text" name="last_name" id="id_last_name" /></td></tr>
+<tr><td><label for="id_birthday">Birthday:</label></td><td><input type="text" name="birthday" id="id_birthday" /></td></tr>
 >>> print p.as_ul()
-<li>First name: <input type="text" name="first_name" /></li>
-<li>Last name: <input type="text" name="last_name" /></li>
-<li>Birthday: <input type="text" name="birthday" /></li>
+<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li>
+<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li>
+<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></li>
 >>> print p.as_p()
-<p>First name: <input type="text" name="first_name" /></p>
-<p>Last name: <input type="text" name="last_name" /></p>
-<p>Birthday: <input type="text" name="birthday" /></p>
+<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p>
+<p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p>
+<p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></p>
 
 Unicode values are handled properly.
 >>> p = Person({'first_name': u'John', 'last_name': u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111', 'birthday': '1940-10-9'})
 >>> p.as_table()
-u'<tr><td>First name:</td><td><input type="text" name="first_name" value="John" /></td></tr>\n<tr><td>Last name:</td><td><input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /></td></tr>\n<tr><td>Birthday:</td><td><input type="text" name="birthday" value="1940-10-9" /></td></tr>'
+u'<tr><td><label for="id_first_name">First name:</label></td><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr>\n<tr><td><label for="id_last_name">Last name:</label></td><td><input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></td></tr>\n<tr><td><label for="id_birthday">Birthday:</label></td><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr>'
 >>> p.as_ul()
-u'<li>First name: <input type="text" name="first_name" value="John" /></li>\n<li>Last name: <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /></li>\n<li>Birthday: <input type="text" name="birthday" value="1940-10-9" /></li>'
+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>'
 >>> p.as_p()
-u'<p>First name: <input type="text" name="first_name" value="John" /></p>\n<p>Last name: <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /></p>\n<p>Birthday: <input type="text" name="birthday" value="1940-10-9" /></p>'
+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>'
 
 >>> p = Person({'last_name': u'Lennon'})
 >>> p.errors
@@ -1437,29 +1437,29 @@ u'* This field is required.'
 
 >>> p = Person()
 >>> print p['first_name']
-<input type="text" name="first_name" />
+<input type="text" name="first_name" id="id_first_name" />
 >>> print p['last_name']
-<input type="text" name="last_name" />
+<input type="text" name="last_name" id="id_last_name" />
 >>> print p['birthday']
-<input type="text" name="birthday" />
+<input type="text" name="birthday" id="id_birthday" />
 
 "auto_id" tells the Form to add an "id" attribute to each form element.
 If it's a string that contains '%s', Django will use that as a format string
 into which the field's name will be inserted. It will also put a <label> around
 the human-readable labels for a field.
->>> p = Person(auto_id='id_%s')
+>>> p = Person(auto_id='%s_id')
 >>> print p.as_table()
-<tr><td><label for="id_first_name">First name:</label></td><td><input type="text" name="first_name" id="id_first_name" /></td></tr>
-<tr><td><label for="id_last_name">Last name:</label></td><td><input type="text" name="last_name" id="id_last_name" /></td></tr>
-<tr><td><label for="id_birthday">Birthday:</label></td><td><input type="text" name="birthday" id="id_birthday" /></td></tr>
+<tr><td><label for="first_name_id">First name:</label></td><td><input type="text" name="first_name" id="first_name_id" /></td></tr>
+<tr><td><label for="last_name_id">Last name:</label></td><td><input type="text" name="last_name" id="last_name_id" /></td></tr>
+<tr><td><label for="birthday_id">Birthday:</label></td><td><input type="text" name="birthday" id="birthday_id" /></td></tr>
 >>> print p.as_ul()
-<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li>
-<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li>
-<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></li>
+<li><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></li>
+<li><label for="last_name_id">Last name:</label> <input type="text" name="last_name" id="last_name_id" /></li>
+<li><label for="birthday_id">Birthday:</label> <input type="text" name="birthday" id="birthday_id" /></li>
 >>> print p.as_p()
-<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p>
-<p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p>
-<p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></p>
+<p><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></p>
+<p><label for="last_name_id">Last name:</label> <input type="text" name="last_name" id="last_name_id" /></p>
+<p><label for="birthday_id">Birthday:</label> <input type="text" name="birthday" id="birthday_id" /></p>
 
 If auto_id is any True value whose str() does not contain '%s', the "id"
 attribute will be the name of the field.
@@ -1500,13 +1500,13 @@ attribute in the Form gets precedence.
 >>> class SignupForm(Form):
 ...     email = EmailField()
 ...     get_spam = BooleanField()
->>> f = SignupForm()
+>>> f = SignupForm(auto_id=False)
 >>> print f['email']
 <input type="text" name="email" />
 >>> print f['get_spam']
 <input type="checkbox" name="get_spam" />
 
->>> f = SignupForm({'email': 'test@example.com', 'get_spam': True})
+>>> f = SignupForm({'email': 'test@example.com', 'get_spam': True}, auto_id=False)
 >>> print f['email']
 <input type="text" name="email" value="test@example.com" />
 >>> print f['get_spam']
@@ -1516,7 +1516,7 @@ Any Field can have a Widget class passed to its constructor:
 >>> class ContactForm(Form):
 ...     subject = CharField()
 ...     message = CharField(widget=Textarea)
->>> f = ContactForm()
+>>> f = ContactForm(auto_id=False)
 >>> print f['subject']
 <input type="text" name="subject" />
 >>> print f['message']
@@ -1535,7 +1535,7 @@ The 'widget' parameter to a Field can also be an instance:
 >>> class ContactForm(Form):
 ...     subject = CharField()
 ...     message = CharField(widget=Textarea(attrs={'rows': 80, 'cols': 20}))
->>> f = ContactForm()
+>>> f = ContactForm(auto_id=False)
 >>> print f['message']
 <textarea rows="80" cols="20" name="message"></textarea>
 
@@ -1543,7 +1543,7 @@ Instance-level attrs are *not* carried over to as_textarea(), as_text() and
 as_hidden():
 >>> f['message'].as_text()
 u'<input type="text" name="message" />'
->>> f = ContactForm({'subject': 'Hello', 'message': 'I love you.'})
+>>> f = ContactForm({'subject': 'Hello', 'message': 'I love you.'}, auto_id=False)
 >>> f['subject'].as_textarea()
 u'<textarea name="subject">Hello</textarea>'
 >>> f['message'].as_text()
@@ -1555,13 +1555,13 @@ For a form with a <select>, use ChoiceField:
 >>> class FrameworkForm(Form):
 ...     name = CharField()
 ...     language = ChoiceField(choices=[('P', 'Python'), ('J', 'Java')])
->>> f = FrameworkForm()
+>>> f = FrameworkForm(auto_id=False)
 >>> print f['language']
 <select name="language">
 <option value="P">Python</option>
 <option value="J">Java</option>
 </select>
->>> f = FrameworkForm({'name': 'Django', 'language': 'P'})
+>>> f = FrameworkForm({'name': 'Django', 'language': 'P'}, auto_id=False)
 >>> print f['language']
 <select name="language">
 <option value="P" selected="selected">Python</option>
@@ -1572,7 +1572,7 @@ Add widget=RadioSelect to use that widget with a ChoiceField.
 >>> class FrameworkForm(Form):
 ...     name = CharField()
 ...     language = ChoiceField(choices=[('P', 'Python'), ('J', 'Java')], widget=RadioSelect)
->>> f = FrameworkForm()
+>>> f = FrameworkForm(auto_id=False)
 >>> print f['language']
 <ul>
 <li><label><input type="radio" name="language" value="P" /> Python</label></li>
@@ -1627,20 +1627,20 @@ MultipleChoiceField is a special case, as its data is required to be a list:
 >>> class SongForm(Form):
 ...     name = CharField()
 ...     composers = MultipleChoiceField()
->>> f = SongForm()
+>>> f = SongForm(auto_id=False)
 >>> print f['composers']
 <select multiple="multiple" name="composers">
 </select>
 >>> class SongForm(Form):
 ...     name = CharField()
 ...     composers = MultipleChoiceField(choices=[('J', 'John Lennon'), ('P', 'Paul McCartney')])
->>> f = SongForm()
+>>> f = SongForm(auto_id=False)
 >>> print f['composers']
 <select multiple="multiple" name="composers">
 <option value="J">John Lennon</option>
 <option value="P">Paul McCartney</option>
 </select>
->>> f = SongForm({'name': 'Yesterday', 'composers': ['P']})
+>>> f = SongForm({'name': 'Yesterday', 'composers': ['P']}, auto_id=False)
 >>> print f['name']
 <input type="text" name="name" value="Yesterday" />
 >>> print f['composers']
@@ -1653,19 +1653,19 @@ MultipleChoiceField can also be used with the CheckboxSelectMultiple widget.
 >>> class SongForm(Form):
 ...     name = CharField()
 ...     composers = MultipleChoiceField(choices=[('J', 'John Lennon'), ('P', 'Paul McCartney')], widget=CheckboxSelectMultiple)
->>> f = SongForm()
+>>> f = SongForm(auto_id=False)
 >>> print f['composers']
 <ul>
 <li><label><input type="checkbox" name="composers" value="J" /> John Lennon</label></li>
 <li><label><input type="checkbox" name="composers" value="P" /> Paul McCartney</label></li>
 </ul>
->>> f = SongForm({'composers': ['J']})
+>>> f = SongForm({'composers': ['J']}, auto_id=False)
 >>> print f['composers']
 <ul>
 <li><label><input checked="checked" type="checkbox" name="composers" value="J" /> John Lennon</label></li>
 <li><label><input type="checkbox" name="composers" value="P" /> Paul McCartney</label></li>
 </ul>
->>> f = SongForm({'composers': ['J', 'P']})
+>>> f = SongForm({'composers': ['J', 'P']}, auto_id=False)
 >>> print f['composers']
 <ul>
 <li><label><input checked="checked" type="checkbox" name="composers" value="J" /> John Lennon</label></li>
@@ -1674,15 +1674,15 @@ MultipleChoiceField can also be used with the CheckboxSelectMultiple widget.
 
 When using CheckboxSelectMultiple, the framework expects a list of input and
 returns a list of input.
->>> f = SongForm({'name': 'Yesterday'})
+>>> f = SongForm({'name': 'Yesterday'}, auto_id=False)
 >>> f.errors
 {'composers': [u'This field is required.']}
->>> f = SongForm({'name': 'Yesterday', 'composers': ['J']})
+>>> f = SongForm({'name': 'Yesterday', 'composers': ['J']}, auto_id=False)
 >>> f.errors
 {}
 >>> f.clean_data
 {'composers': [u'J'], 'name': u'Yesterday'}
->>> f = SongForm({'name': 'Yesterday', 'composers': ['J', 'P']})
+>>> f = SongForm({'name': 'Yesterday', 'composers': ['J', 'P']}, auto_id=False)
 >>> f.errors
 {}
 >>> f.clean_data
@@ -1703,16 +1703,16 @@ including the current field (e.g., the field XXX if you're in clean_XXX()).
 ...        if self.clean_data.get('password1') and self.clean_data.get('password2') and self.clean_data['password1'] != self.clean_data['password2']:
 ...            raise ValidationError(u'Please make sure your passwords match.')
 ...        return self.clean_data['password2']
->>> f = UserRegistration()
+>>> f = UserRegistration(auto_id=False)
 >>> f.errors
 {}
->>> f = UserRegistration({})
+>>> f = UserRegistration({}, auto_id=False)
 >>> f.errors
 {'username': [u'This field is required.'], 'password1': [u'This field is required.'], 'password2': [u'This field is required.']}
->>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'bar'})
+>>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)
 >>> f.errors
 {'password2': [u'Please make sure your passwords match.']}
->>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'})
+>>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'}, auto_id=False)
 >>> f.errors
 {}
 >>> f.clean_data
@@ -1733,10 +1733,10 @@ Form.clean() is required to return a dictionary of all clean data.
 ...        if self.clean_data.get('password1') and self.clean_data.get('password2') and self.clean_data['password1'] != self.clean_data['password2']:
 ...            raise ValidationError(u'Please make sure your passwords match.')
 ...        return self.clean_data
->>> f = UserRegistration()
+>>> f = UserRegistration(auto_id=False)
 >>> f.errors
 {}
->>> f = UserRegistration({})
+>>> f = UserRegistration({}, auto_id=False)
 >>> print f.as_table()
 <tr><td colspan="2"><ul class="errorlist"><li>This field is required.</li></ul></td></tr>
 <tr><td>Username:</td><td><input type="text" name="username" maxlength="10" /></td></tr>
@@ -1746,7 +1746,7 @@ Form.clean() is required to return a dictionary of all clean data.
 <tr><td>Password2:</td><td><input type="password" name="password2" /></td></tr>
 >>> f.errors
 {'username': [u'This field is required.'], 'password1': [u'This field is required.'], 'password2': [u'This field is required.']}
->>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'bar'})
+>>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)
 >>> f.errors
 {'__all__': [u'Please make sure your passwords match.']}
 >>> print f.as_table()
@@ -1759,7 +1759,7 @@ Form.clean() is required to return a dictionary of all clean data.
 <li>Username: <input type="text" name="username" value="adrian" maxlength="10" /></li>
 <li>Password1: <input type="password" name="password1" value="foo" /></li>
 <li>Password2: <input type="password" name="password2" value="bar" /></li>
->>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'})
+>>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'}, auto_id=False)
 >>> f.errors
 {}
 >>> f.clean_data
@@ -1771,10 +1771,10 @@ subclass' __init__().
 >>> class Person(Form):
 ...     first_name = CharField()
 ...     last_name = CharField()
-...     def __init__(self):
-...         super(Person, self).__init__()
+...     def __init__(self, *args, **kwargs):
+...         super(Person, self).__init__(*args, **kwargs)
 ...         self.fields['birthday'] = DateField()
->>> p = Person()
+>>> p = Person(auto_id=False)
 >>> print p
 <tr><td>First name:</td><td><input type="text" name="first_name" /></td></tr>
 <tr><td>Last name:</td><td><input type="text" name="last_name" /></td></tr>
@@ -1789,7 +1789,7 @@ form, directly after that row's form element.
 ...     last_name = CharField()
 ...     hidden_text = CharField(widget=HiddenInput)
 ...     birthday = DateField()
->>> p = Person()
+>>> p = Person(auto_id=False)
 >>> print p
 <tr><td>First name:</td><td><input type="text" name="first_name" /></td></tr>
 <tr><td>Last name:</td><td><input type="text" name="last_name" /></td></tr>
@@ -1822,7 +1822,7 @@ If a field with a HiddenInput has errors, the as_table() and as_ul() output
 will include the error message(s) with the text "(Hidden field [fieldname]) "
 prepended. This message is displayed at the top of the output, regardless of
 its field's order in the form.
->>> p = Person({'first_name': 'John', 'last_name': 'Lennon', 'birthday': '1940-10-9'})
+>>> p = Person({'first_name': 'John', 'last_name': 'Lennon', 'birthday': '1940-10-9'}, auto_id=False)
 >>> print p
 <tr><td colspan="2"><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></td></tr>
 <tr><td>First name:</td><td><input type="text" name="first_name" value="John" /></td></tr>
@@ -1843,7 +1843,7 @@ A corner case: It's possible for a form to have only HiddenInputs.
 >>> class TestForm(Form):
 ...     foo = CharField(widget=HiddenInput)
 ...     bar = CharField(widget=HiddenInput)
->>> p = TestForm()
+>>> p = TestForm(auto_id=False)
 >>> print p.as_table()
 <input type="hidden" name="foo" /><input type="hidden" name="bar" />
 >>> print p.as_ul()
@@ -1867,7 +1867,7 @@ A Form's fields are displayed in the same order in which they were defined.
 ...     field12 = CharField()
 ...     field13 = CharField()
 ...     field14 = CharField()
->>> p = TestForm()
+>>> p = TestForm(auto_id=False)
 >>> print p
 <tr><td>Field1:</td><td><input type="text" name="field1" /></td></tr>
 <tr><td>Field2:</td><td><input type="text" name="field2" /></td></tr>
@@ -1893,7 +1893,7 @@ include the "maxlength" attribute.
 ...    password = CharField(max_length=10, widget=PasswordInput)
 ...    realname = CharField(max_length=10, widget=TextInput) # redundantly define widget, just to test
 ...    address = CharField()                                 # no max_length defined here
->>> p = UserRegistration()
+>>> p = UserRegistration(auto_id=False)
 >>> print p.as_ul()
 <li>Username: <input type="text" name="username" maxlength="10" /></li>
 <li>Password: <input type="password" name="password" maxlength="10" /></li>
@@ -1906,7 +1906,7 @@ in "attrs".
 >>> class UserRegistration(Form):
 ...    username = CharField(max_length=10, widget=TextInput(attrs={'maxlength': 20}))
 ...    password = CharField(max_length=10, widget=PasswordInput)
->>> p = UserRegistration()
+>>> p = UserRegistration(auto_id=False)
 >>> print p.as_ul()
 <li>Username: <input type="text" name="username" maxlength="10" /></li>
 <li>Password: <input type="password" name="password" maxlength="10" /></li>
@@ -1918,7 +1918,7 @@ underscores converted to spaces, and the initial letter capitalized.
 ...    username = CharField(max_length=10, label='Your username')
 ...    password1 = CharField(widget=PasswordInput)
 ...    password2 = CharField(widget=PasswordInput, label='Password (again)')
->>> p = UserRegistration()
+>>> p = UserRegistration(auto_id=False)
 >>> print p.as_ul()
 <li>Your username: <input type="text" name="username" maxlength="10" /></li>
 <li>Password1: <input type="password" name="password1" /></li>
@@ -1937,9 +1937,9 @@ underscores converted to spaces, and the initial letter capitalized.
 ...        return self.clean_data
 >>> def my_function(method, post_data):
 ...     if method == 'POST':
-...         form = UserRegistration(post_data)
+...         form = UserRegistration(post_data, auto_id=False)
 ...     else:
-...         form = UserRegistration()
+...         form = UserRegistration(auto_id=False)
 ...     if form.is_valid():
 ...         return 'VALID: %r' % form.clean_data
 ...     t = Template('<form action="" method="post">\n<table>\n{{ form }}\n</table>\n<input type="submit" />\n</form>')
@@ -1995,14 +1995,14 @@ particular field.
 ... {{ form.password2.errors.as_ul }}<p><label>Password (again): {{ form.password2 }}</label></p>
 ... <input type="submit" />
 ... </form>''')
->>> print t.render(Context({'form': UserRegistration()}))
+>>> print t.render(Context({'form': UserRegistration(auto_id=False)}))
 <form action="">
 <p><label>Your username: <input type="text" name="username" maxlength="10" /></label></p>
 <p><label>Password: <input type="password" name="password1" /></label></p>
 <p><label>Password (again): <input type="password" name="password2" /></label></p>
 <input type="submit" />
 </form>
->>> print t.render(Context({'form': UserRegistration({'username': 'django'})}))
+>>> print t.render(Context({'form': UserRegistration({'username': 'django'}, auto_id=False)}))
 <form action="">
 <p><label>Your username: <input type="text" name="username" value="django" maxlength="10" /></label></p>
 <ul class="errorlist"><li>This field is required.</li></ul><p><label>Password: <input type="password" name="password1" /></label></p>
@@ -2020,7 +2020,7 @@ and the initial letter capitalized.
 ... <p><label>{{ form.password2.label }}: {{ form.password2 }}</label></p>
 ... <input type="submit" />
 ... </form>''')
->>> print t.render(Context({'form': UserRegistration()}))
+>>> print t.render(Context({'form': UserRegistration(auto_id=False)}))
 <form action="">
 <p><label>Username: <input type="text" name="username" maxlength="10" /></label></p>
 <p><label>Password1: <input type="password" name="password1" /></label></p>
@@ -2038,7 +2038,7 @@ field an "id" attribute.
 ... <p>{{ form.password2.label_tag }}: {{ form.password2 }}</p>
 ... <input type="submit" />
 ... </form>''')
->>> print t.render(Context({'form': UserRegistration()}))
+>>> print t.render(Context({'form': UserRegistration(auto_id=False)}))
 <form action="">
 <p>Username: <input type="text" name="username" maxlength="10" /></p>
 <p>Password1: <input type="password" name="password1" /></p>
@@ -2063,7 +2063,7 @@ the list of errors is empty). You can also use it in {% if %} statements.
 ... {{ form.password2.errors.as_ul }}<p><label>Password (again): {{ form.password2 }}</label></p>
 ... <input type="submit" />
 ... </form>''')
->>> print t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'})}))
+>>> print t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)}))
 <form action="">
 <p><label>Your username: <input type="text" name="username" value="django" maxlength="10" /></label></p>
 <p><label>Password: <input type="password" name="password1" value="foo" /></label></p>
@@ -2077,7 +2077,7 @@ the list of errors is empty). You can also use it in {% if %} statements.
 ... {{ form.password2.errors.as_ul }}<p><label>Password (again): {{ form.password2 }}</label></p>
 ... <input type="submit" />
 ... </form>''')
->>> print t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'})}))
+>>> print t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)}))
 <form action="">
 <ul class="errorlist"><li>Please make sure your passwords match.</li></ul>
 <p><label>Your username: <input type="text" name="username" value="django" maxlength="10" /></label></p>