diff options
| author | Jon Dufresne <jon.dufresne@gmail.com> | 2016-03-28 11:02:04 -0700 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-04-21 19:16:38 -0400 |
| commit | ec6121693f112ae33b653b4364e812722d2eb567 (patch) | |
| tree | b791f1345a114d07657a3d226d1c5ff4b1e3f369 /docs/ref/forms | |
| parent | 4d1c229ee5cb210e8b592a8d9c87d4a66864328e (diff) | |
Fixed #22383 -- Added support for HTML5 required attribute on required form fields.
Diffstat (limited to 'docs/ref/forms')
| -rw-r--r-- | docs/ref/forms/api.txt | 189 | ||||
| -rw-r--r-- | docs/ref/forms/fields.txt | 44 | ||||
| -rw-r--r-- | docs/ref/forms/widgets.txt | 30 |
3 files changed, 137 insertions, 126 deletions
diff --git a/docs/ref/forms/api.txt b/docs/ref/forms/api.txt index f1c46da947..c468dc38a0 100644 --- a/docs/ref/forms/api.txt +++ b/docs/ref/forms/api.txt @@ -244,9 +244,9 @@ precedence:: ... comment = forms.CharField() >>> f = CommentForm(initial={'name': 'instance'}, auto_id=False) >>> print(f) - <tr><th>Name:</th><td><input type="text" name="name" value="instance" /></td></tr> - <tr><th>Url:</th><td><input type="url" name="url" /></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + <tr><th>Name:</th><td><input type="text" name="name" value="instance" required /></td></tr> + <tr><th>Url:</th><td><input type="url" name="url" required /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" required /></td></tr> Checking which form data has changed ==================================== @@ -305,10 +305,10 @@ You can alter the field of :class:`Form` instance to change the way it is presented in the form:: >>> f.as_table().split('\n')[0] - '<tr><th>Name:</th><td><input name="name" type="text" value="instance" /></td></tr>' + '<tr><th>Name:</th><td><input name="name" type="text" value="instance" required /></td></tr>' >>> f.fields['name'].label = "Username" >>> f.as_table().split('\n')[0] - '<tr><th>Username:</th><td><input name="name" type="text" value="instance" /></td></tr>' + '<tr><th>Username:</th><td><input name="name" type="text" value="instance" required /></td></tr>' Beware not to alter the ``base_fields`` attribute because this modification will influence all subsequent ``ContactForm`` instances within the same Python @@ -317,7 +317,7 @@ process:: >>> f.base_fields['name'].label = "Username" >>> another_f = CommentForm(auto_id=False) >>> another_f.as_table().split('\n')[0] - '<tr><th>Username:</th><td><input name="name" type="text" value="class" /></td></tr>' + '<tr><th>Username:</th><td><input name="name" type="text" value="class" required /></td></tr>' Accessing "clean" data ====================== @@ -421,9 +421,9 @@ simply ``print`` it:: >>> f = ContactForm() >>> print(f) - <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr> - <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr> - <tr><th><label for="id_sender">Sender:</label></th><td><input type="email" name="sender" id="id_sender" /></td></tr> + <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" required /></td></tr> + <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" required /></td></tr> + <tr><th><label for="id_sender">Sender:</label></th><td><input type="email" name="sender" id="id_sender" required /></td></tr> <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr> If the form is bound to data, the HTML output will include that data @@ -438,9 +438,9 @@ include ``checked="checked"`` if appropriate:: ... 'cc_myself': True} >>> f = ContactForm(data) >>> print(f) - <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" value="hello" /></td></tr> - <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" value="Hi there" /></td></tr> - <tr><th><label for="id_sender">Sender:</label></th><td><input type="email" name="sender" id="id_sender" value="foo@example.com" /></td></tr> + <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" value="hello" required /></td></tr> + <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" value="Hi there" required /></td></tr> + <tr><th><label for="id_sender">Sender:</label></th><td><input type="email" name="sender" id="id_sender" value="foo@example.com" required /></td></tr> <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" checked="checked" /></td></tr> This default output is a two-column HTML table, with a ``<tr>`` for each field. @@ -485,11 +485,11 @@ containing one field:: >>> f = ContactForm() >>> f.as_p() - '<p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p>\n<p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>\n<p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p>\n<p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>' + '<p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" required /></p>\n<p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" required /></p>\n<p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" required /></p>\n<p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>' >>> print(f.as_p()) - <p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p> - <p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p> - <p><label for="id_sender">Sender:</label> <input type="email" name="sender" id="id_sender" /></p> + <p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" required /></p> + <p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" required /></p> + <p><label for="id_sender">Sender:</label> <input type="email" name="sender" id="id_sender" required /></p> <p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p> ``as_ul()`` @@ -504,11 +504,11 @@ flexibility:: >>> f = ContactForm() >>> f.as_ul() - '<li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></li>\n<li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>\n<li><label for="id_sender">Sender:</label> <input type="email" name="sender" id="id_sender" /></li>\n<li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li>' + '<li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" required /></li>\n<li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" required /></li>\n<li><label for="id_sender">Sender:</label> <input type="email" name="sender" id="id_sender" required /></li>\n<li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li>' >>> print(f.as_ul()) - <li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li> - <li><label for="id_sender">Sender:</label> <input type="email" name="sender" id="id_sender" /></li> + <li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" required /></li> + <li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" required /></li> + <li><label for="id_sender">Sender:</label> <input type="email" name="sender" id="id_sender" required /></li> <li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li> ``as_table()`` @@ -522,11 +522,11 @@ it calls its ``as_table()`` method behind the scenes:: >>> f = ContactForm() >>> f.as_table() - '<tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr>\n<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr>\n<tr><th><label for="id_sender">Sender:</label></th><td><input type="email" name="sender" id="id_sender" /></td></tr>\n<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>' + '<tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" required /></td></tr>\n<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" required /></td></tr>\n<tr><th><label for="id_sender">Sender:</label></th><td><input type="email" name="sender" id="id_sender" required /></td></tr>\n<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>' >>> print(f.as_table()) - <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr> - <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr> - <tr><th><label for="id_sender">Sender:</label></th><td><input type="email" name="sender" id="id_sender" /></td></tr> + <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" required /></td></tr> + <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" required /></td></tr> + <tr><th><label for="id_sender">Sender:</label></th><td><input type="email" name="sender" id="id_sender" required /></td></tr> <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr> .. _ref-forms-api-styling-form-rows: @@ -597,19 +597,19 @@ tags nor ``id`` attributes:: >>> f = ContactForm(auto_id=False) >>> print(f.as_table()) - <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /></td></tr> - <tr><th>Message:</th><td><input type="text" name="message" /></td></tr> - <tr><th>Sender:</th><td><input type="email" name="sender" /></td></tr> + <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" required /></td></tr> + <tr><th>Message:</th><td><input type="text" name="message" required /></td></tr> + <tr><th>Sender:</th><td><input type="email" name="sender" required /></td></tr> <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr> >>> print(f.as_ul()) - <li>Subject: <input type="text" name="subject" maxlength="100" /></li> - <li>Message: <input type="text" name="message" /></li> - <li>Sender: <input type="email" name="sender" /></li> + <li>Subject: <input type="text" name="subject" maxlength="100" required /></li> + <li>Message: <input type="text" name="message" required /></li> + <li>Sender: <input type="email" name="sender" required /></li> <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> >>> print(f.as_p()) - <p>Subject: <input type="text" name="subject" maxlength="100" /></p> - <p>Message: <input type="text" name="message" /></p> - <p>Sender: <input type="email" name="sender" /></p> + <p>Subject: <input type="text" name="subject" maxlength="100" required /></p> + <p>Message: <input type="text" name="message" required /></p> + <p>Sender: <input type="email" name="sender" required /></p> <p>Cc myself: <input type="checkbox" name="cc_myself" /></p> If ``auto_id`` is set to ``True``, then the form output *will* include @@ -618,19 +618,19 @@ field:: >>> f = ContactForm(auto_id=True) >>> print(f.as_table()) - <tr><th><label for="subject">Subject:</label></th><td><input id="subject" type="text" name="subject" maxlength="100" /></td></tr> - <tr><th><label for="message">Message:</label></th><td><input type="text" name="message" id="message" /></td></tr> - <tr><th><label for="sender">Sender:</label></th><td><input type="email" name="sender" id="sender" /></td></tr> + <tr><th><label for="subject">Subject:</label></th><td><input id="subject" type="text" name="subject" maxlength="100" required /></td></tr> + <tr><th><label for="message">Message:</label></th><td><input type="text" name="message" id="message" required /></td></tr> + <tr><th><label for="sender">Sender:</label></th><td><input type="email" name="sender" id="sender" required /></td></tr> <tr><th><label for="cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="cc_myself" /></td></tr> >>> print(f.as_ul()) - <li><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="message">Message:</label> <input type="text" name="message" id="message" /></li> - <li><label for="sender">Sender:</label> <input type="email" name="sender" id="sender" /></li> + <li><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" required /></li> + <li><label for="message">Message:</label> <input type="text" name="message" id="message" required /></li> + <li><label for="sender">Sender:</label> <input type="email" name="sender" id="sender" required /></li> <li><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></li> >>> print(f.as_p()) - <p><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></p> - <p><label for="message">Message:</label> <input type="text" name="message" id="message" /></p> - <p><label for="sender">Sender:</label> <input type="email" name="sender" id="sender" /></p> + <p><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" required /></p> + <p><label for="message">Message:</label> <input type="text" name="message" id="message" required /></p> + <p><label for="sender">Sender:</label> <input type="email" name="sender" id="sender" required /></p> <p><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></p> If ``auto_id`` is set to a string containing the format character ``'%s'``, @@ -641,19 +641,19 @@ attributes based on the format string. For example, for a format string >>> f = ContactForm(auto_id='id_for_%s') >>> print(f.as_table()) - <tr><th><label for="id_for_subject">Subject:</label></th><td><input id="id_for_subject" type="text" name="subject" maxlength="100" /></td></tr> - <tr><th><label for="id_for_message">Message:</label></th><td><input type="text" name="message" id="id_for_message" /></td></tr> - <tr><th><label for="id_for_sender">Sender:</label></th><td><input type="email" name="sender" id="id_for_sender" /></td></tr> + <tr><th><label for="id_for_subject">Subject:</label></th><td><input id="id_for_subject" type="text" name="subject" maxlength="100" required /></td></tr> + <tr><th><label for="id_for_message">Message:</label></th><td><input type="text" name="message" id="id_for_message" required /></td></tr> + <tr><th><label for="id_for_sender">Sender:</label></th><td><input type="email" name="sender" id="id_for_sender" required /></td></tr> <tr><th><label for="id_for_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></td></tr> >>> print(f.as_ul()) - <li><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" /></li> - <li><label for="id_for_sender">Sender:</label> <input type="email" name="sender" id="id_for_sender" /></li> + <li><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" required /></li> + <li><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" required /></li> + <li><label for="id_for_sender">Sender:</label> <input type="email" name="sender" id="id_for_sender" required /></li> <li><label for="id_for_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li> >>> print(f.as_p()) - <p><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></p> - <p><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" /></p> - <p><label for="id_for_sender">Sender:</label> <input type="email" name="sender" id="id_for_sender" /></p> + <p><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" required /></p> + <p><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" required /></p> + <p><label for="id_for_sender">Sender:</label> <input type="email" name="sender" id="id_for_sender" required /></p> <p><label for="id_for_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></p> If ``auto_id`` is set to any other true value -- such as a string that doesn't @@ -671,15 +671,15 @@ It's possible to customize that character, or omit it entirely, using the >>> f = ContactForm(auto_id='id_for_%s', label_suffix='') >>> print(f.as_ul()) - <li><label for="id_for_subject">Subject</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="id_for_message">Message</label> <input type="text" name="message" id="id_for_message" /></li> - <li><label for="id_for_sender">Sender</label> <input type="email" name="sender" id="id_for_sender" /></li> + <li><label for="id_for_subject">Subject</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" required /></li> + <li><label for="id_for_message">Message</label> <input type="text" name="message" id="id_for_message" required /></li> + <li><label for="id_for_sender">Sender</label> <input type="email" name="sender" id="id_for_sender" required /></li> <li><label for="id_for_cc_myself">Cc myself</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li> >>> f = ContactForm(auto_id='id_for_%s', label_suffix=' ->') >>> print(f.as_ul()) - <li><label for="id_for_subject">Subject -></label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="id_for_message">Message -></label> <input type="text" name="message" id="id_for_message" /></li> - <li><label for="id_for_sender">Sender -></label> <input type="email" name="sender" id="id_for_sender" /></li> + <li><label for="id_for_subject">Subject -></label> <input id="id_for_subject" type="text" name="subject" maxlength="100" required /></li> + <li><label for="id_for_message">Message -></label> <input type="text" name="message" id="id_for_message" required /></li> + <li><label for="id_for_sender">Sender -></label> <input type="email" name="sender" id="id_for_sender" required /></li> <li><label for="id_for_cc_myself">Cc myself -></label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li> Note that the label suffix is added only if the last character of the @@ -692,6 +692,17 @@ This will take precedence over :attr:`Form.label_suffix using the ``label_suffix`` parameter to :meth:`~django.forms.BoundField.label_tag`. +.. attribute:: Form.use_required_attribute + +.. versionadded:: 1.10 + +When set to ``True`` (the default), required form fields will have the +``required`` HTML attribute. + +:doc:`Formsets </topics/forms/formsets>` instantiate forms with +``use_required_attribute=False`` to avoid incorrect browser validation when +adding and deleting forms from a formset. + Notes on field ordering ----------------------- @@ -741,21 +752,21 @@ method you're using:: ... 'cc_myself': True} >>> f = ContactForm(data, auto_id=False) >>> print(f.as_table()) - <tr><th>Subject:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="subject" maxlength="100" /></td></tr> - <tr><th>Message:</th><td><input type="text" name="message" value="Hi there" /></td></tr> - <tr><th>Sender:</th><td><ul class="errorlist"><li>Enter a valid email address.</li></ul><input type="email" name="sender" value="invalid email address" /></td></tr> + <tr><th>Subject:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="subject" maxlength="100" required /></td></tr> + <tr><th>Message:</th><td><input type="text" name="message" value="Hi there" required /></td></tr> + <tr><th>Sender:</th><td><ul class="errorlist"><li>Enter a valid email address.</li></ul><input type="email" name="sender" value="invalid email address" required /></td></tr> <tr><th>Cc myself:</th><td><input checked="checked" type="checkbox" name="cc_myself" /></td></tr> >>> print(f.as_ul()) - <li><ul class="errorlist"><li>This field is required.</li></ul>Subject: <input type="text" name="subject" maxlength="100" /></li> - <li>Message: <input type="text" name="message" value="Hi there" /></li> - <li><ul class="errorlist"><li>Enter a valid email address.</li></ul>Sender: <input type="email" name="sender" value="invalid email address" /></li> + <li><ul class="errorlist"><li>This field is required.</li></ul>Subject: <input type="text" name="subject" maxlength="100" required /></li> + <li>Message: <input type="text" name="message" value="Hi there" required /></li> + <li><ul class="errorlist"><li>Enter a valid email address.</li></ul>Sender: <input type="email" name="sender" value="invalid email address" required /></li> <li>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></li> >>> print(f.as_p()) <p><ul class="errorlist"><li>This field is required.</li></ul></p> - <p>Subject: <input type="text" name="subject" maxlength="100" /></p> - <p>Message: <input type="text" name="message" value="Hi there" /></p> + <p>Subject: <input type="text" name="subject" maxlength="100" required /></p> + <p>Message: <input type="text" name="message" value="Hi there" required /></p> <p><ul class="errorlist"><li>Enter a valid email address.</li></ul></p> - <p>Sender: <input type="email" name="sender" value="invalid email address" /></p> + <p>Sender: <input type="email" name="sender" value="invalid email address" required /></p> <p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p> .. _ref-forms-error-list-format: @@ -778,10 +789,10 @@ Python 2):: >>> f = ContactForm(data, auto_id=False, error_class=DivErrorList) >>> f.as_p() <div class="errorlist"><div class="error">This field is required.</div></div> - <p>Subject: <input type="text" name="subject" maxlength="100" /></p> - <p>Message: <input type="text" name="message" value="Hi there" /></p> + <p>Subject: <input type="text" name="subject" maxlength="100" required /></p> + <p>Message: <input type="text" name="message" value="Hi there" required /></p> <div class="errorlist"><div class="error">Enter a valid email address.</div></div> - <p>Sender: <input type="email" name="sender" value="invalid email address" /></p> + <p>Sender: <input type="email" name="sender" value="invalid email address" required /></p> <p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p> More granular output @@ -803,25 +814,25 @@ using the field's name as the key:: >>> form = ContactForm() >>> print(form['subject']) - <input id="id_subject" type="text" name="subject" maxlength="100" /> + <input id="id_subject" type="text" name="subject" maxlength="100" required /> To retrieve all ``BoundField`` objects, iterate the form:: >>> form = ContactForm() >>> for boundfield in form: print(boundfield) - <input id="id_subject" type="text" name="subject" maxlength="100" /> - <input type="text" name="message" id="id_message" /> - <input type="email" name="sender" id="id_sender" /> + <input id="id_subject" type="text" name="subject" maxlength="100" required /> + <input type="text" name="message" id="id_message" required /> + <input type="email" name="sender" id="id_sender" required /> <input type="checkbox" name="cc_myself" id="id_cc_myself" /> The field-specific output honors the form object's ``auto_id`` setting:: >>> f = ContactForm(auto_id=False) >>> print(f['message']) - <input type="text" name="message" /> + <input type="text" name="message" required /> >>> f = ContactForm(auto_id='id_%s') >>> print(f['message']) - <input type="text" name="message" id="id_message" /> + <input type="text" name="message" id="id_message" required /> Attributes of ``BoundField`` ---------------------------- @@ -852,7 +863,7 @@ Attributes of ``BoundField`` >>> data = {'subject': 'hi', 'message': '', 'sender': '', 'cc_myself': ''} >>> f = ContactForm(data, auto_id=False) >>> print(f['message']) - <input type="text" name="message" /> + <input type="text" name="message" required /> >>> f['message'].errors ['This field is required.'] >>> print(f['message'].errors) @@ -904,7 +915,7 @@ Attributes of ``BoundField`` .. code-block:: html - <label for="myFIELD">...</label><input id="myFIELD" type="text" name="my_field" /> + <label for="myFIELD">...</label><input id="myFIELD" type="text" name="my_field" required /> .. attribute:: BoundField.is_hidden @@ -1125,11 +1136,11 @@ fields are ordered first:: ... priority = forms.CharField() >>> f = ContactFormWithPriority(auto_id=False) >>> print(f.as_ul()) - <li>Subject: <input type="text" name="subject" maxlength="100" /></li> - <li>Message: <input type="text" name="message" /></li> - <li>Sender: <input type="email" name="sender" /></li> + <li>Subject: <input type="text" name="subject" maxlength="100" required /></li> + <li>Message: <input type="text" name="message" required /></li> + <li>Sender: <input type="email" name="sender" required /></li> <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> - <li>Priority: <input type="text" name="priority" /></li> + <li>Priority: <input type="text" name="priority" required /></li> It's possible to subclass multiple forms, treating forms as mixins. In this example, ``BeatleForm`` subclasses both ``PersonForm`` and ``InstrumentForm`` @@ -1146,10 +1157,10 @@ classes:: ... haircut_type = CharField() >>> b = BeatleForm(auto_id=False) >>> print(b.as_ul()) - <li>First name: <input type="text" name="first_name" /></li> - <li>Last name: <input type="text" name="last_name" /></li> - <li>Instrument: <input type="text" name="instrument" /></li> - <li>Haircut type: <input type="text" name="haircut_type" /></li> + <li>First name: <input type="text" name="first_name" required /></li> + <li>Last name: <input type="text" name="last_name" required /></li> + <li>Instrument: <input type="text" name="instrument" required /></li> + <li>Haircut type: <input type="text" name="haircut_type" required /></li> It's possible to declaratively remove a ``Field`` inherited from a parent class by setting the name of the field to ``None`` on the subclass. For example:: @@ -1179,11 +1190,11 @@ You can put several Django forms inside one ``<form>`` tag. To give each >>> mother = PersonForm(prefix="mother") >>> father = PersonForm(prefix="father") >>> print(mother.as_ul()) - <li><label for="id_mother-first_name">First name:</label> <input type="text" name="mother-first_name" id="id_mother-first_name" /></li> - <li><label for="id_mother-last_name">Last name:</label> <input type="text" name="mother-last_name" id="id_mother-last_name" /></li> + <li><label for="id_mother-first_name">First name:</label> <input type="text" name="mother-first_name" id="id_mother-first_name" required /></li> + <li><label for="id_mother-last_name">Last name:</label> <input type="text" name="mother-last_name" id="id_mother-last_name" required /></li> >>> print(father.as_ul()) - <li><label for="id_father-first_name">First name:</label> <input type="text" name="father-first_name" id="id_father-first_name" /></li> - <li><label for="id_father-last_name">Last name:</label> <input type="text" name="father-last_name" id="id_father-last_name" /></li> + <li><label for="id_father-first_name">First name:</label> <input type="text" name="father-first_name" id="id_father-first_name" required /></li> + <li><label for="id_father-last_name">Last name:</label> <input type="text" name="father-last_name" id="id_father-last_name" required /></li> The prefix can also be specified on the form class:: diff --git a/docs/ref/forms/fields.txt b/docs/ref/forms/fields.txt index 1748262de4..f21bae462a 100644 --- a/docs/ref/forms/fields.txt +++ b/docs/ref/forms/fields.txt @@ -115,9 +115,9 @@ We've specified ``auto_id=False`` to simplify the output:: ... comment = forms.CharField() >>> f = CommentForm(auto_id=False) >>> print(f) - <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr> - <tr><th>Your website:</th><td><input type="url" name="url" /></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + <tr><th>Your name:</th><td><input type="text" name="name" required /></td></tr> + <tr><th>Your website:</th><td><input type="url" name="url" required /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" required /></td></tr> ``label_suffix`` ---------------- @@ -133,9 +133,9 @@ The ``label_suffix`` argument lets you override the form's ... captcha_answer = forms.IntegerField(label='2 + 2', label_suffix=' =') >>> f = ContactForm(label_suffix='?') >>> print(f.as_p()) - <p><label for="id_age">Age?</label> <input id="id_age" name="age" type="number" /></p> - <p><label for="id_nationality">Nationality?</label> <input id="id_nationality" name="nationality" type="text" /></p> - <p><label for="id_captcha_answer">2 + 2 =</label> <input id="id_captcha_answer" name="captcha_answer" type="number" /></p> + <p><label for="id_age">Age?</label> <input id="id_age" name="age" type="number" required /></p> + <p><label for="id_nationality">Nationality?</label> <input id="id_nationality" name="nationality" type="text" required /></p> + <p><label for="id_captcha_answer">2 + 2 =</label> <input id="id_captcha_answer" name="captcha_answer" type="number" required /></p> ``initial`` ----------- @@ -157,9 +157,9 @@ field is initialized to a particular value. For example:: ... comment = forms.CharField() >>> f = CommentForm(auto_id=False) >>> print(f) - <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr> - <tr><th>Url:</th><td><input type="url" name="url" value="http://" /></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + <tr><th>Name:</th><td><input type="text" name="name" value="Your name" required /></td></tr> + <tr><th>Url:</th><td><input type="url" name="url" value="http://" required /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" required /></td></tr> You may be thinking, why not just pass a dictionary of the initial values as data when displaying the form? Well, if you do that, you'll trigger validation, @@ -172,9 +172,9 @@ and the HTML output will include any validation errors:: >>> default_data = {'name': 'Your name', 'url': 'http://'} >>> f = CommentForm(default_data, auto_id=False) >>> print(f) - <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr> - <tr><th>Url:</th><td><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="url" name="url" value="http://" /></td></tr> - <tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" /></td></tr> + <tr><th>Name:</th><td><input type="text" name="name" value="Your name" required /></td></tr> + <tr><th>Url:</th><td><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="url" name="url" value="http://" required /></td></tr> + <tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" required /></td></tr> This is why ``initial`` values are only displayed for unbound forms. For bound forms, the HTML output will use the bound data. @@ -201,7 +201,7 @@ Instead of a constant, you can also pass any callable:: >>> class DateForm(forms.Form): ... day = forms.DateField(initial=datetime.date.today) >>> print(DateForm()) - <tr><th>Day:</th><td><input type="text" name="day" value="12/23/2008" /><td></tr> + <tr><th>Day:</th><td><input type="text" name="day" value="12/23/2008" required /><td></tr> The callable will be evaluated only when the unbound form is displayed, not when it is defined. @@ -237,19 +237,19 @@ fields. We've specified ``auto_id=False`` to simplify the output:: ... cc_myself = forms.BooleanField(required=False) >>> f = HelpTextContactForm(auto_id=False) >>> print(f.as_table()) - <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /><br /><span class="helptext">100 characters max.</span></td></tr> - <tr><th>Message:</th><td><input type="text" name="message" /></td></tr> - <tr><th>Sender:</th><td><input type="email" name="sender" /><br />A valid email address, please.</td></tr> + <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" required /><br /><span class="helptext">100 characters max.</span></td></tr> + <tr><th>Message:</th><td><input type="text" name="message" required /></td></tr> + <tr><th>Sender:</th><td><input type="email" name="sender" required /><br />A valid email address, please.</td></tr> <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr> >>> print(f.as_ul())) - <li>Subject: <input type="text" name="subject" maxlength="100" /> <span class="helptext">100 characters max.</span></li> - <li>Message: <input type="text" name="message" /></li> - <li>Sender: <input type="email" name="sender" /> A valid email address, please.</li> + <li>Subject: <input type="text" name="subject" maxlength="100" required /> <span class="helptext">100 characters max.</span></li> + <li>Message: <input type="text" name="message" required /></li> + <li>Sender: <input type="email" name="sender" required /> A valid email address, please.</li> <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> >>> print(f.as_p()) - <p>Subject: <input type="text" name="subject" maxlength="100" /> <span class="helptext">100 characters max.</span></p> - <p>Message: <input type="text" name="message" /></p> - <p>Sender: <input type="email" name="sender" /> A valid email address, please.</p> + <p>Subject: <input type="text" name="subject" maxlength="100" required /> <span class="helptext">100 characters max.</span></p> + <p>Message: <input type="text" name="message" required /></p> + <p>Sender: <input type="email" name="sender" required /> A valid email address, please.</p> <p>Cc myself: <input type="checkbox" name="cc_myself" /></p> ``error_messages`` diff --git a/docs/ref/forms/widgets.txt b/docs/ref/forms/widgets.txt index e347876724..f2b132ce3d 100644 --- a/docs/ref/forms/widgets.txt +++ b/docs/ref/forms/widgets.txt @@ -135,9 +135,9 @@ provided for each widget will be rendered exactly the same:: >>> f = CommentForm(auto_id=False) >>> f.as_table() - <tr><th>Name:</th><td><input type="text" name="name" /></td></tr> - <tr><th>Url:</th><td><input type="url" name="url"/></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + <tr><th>Name:</th><td><input type="text" name="name" required /></td></tr> + <tr><th>Url:</th><td><input type="url" name="url" required /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" required /></td></tr> On a real Web page, you probably don't want every widget to look the same. You might want a larger input element for the comment, and you might want the @@ -154,9 +154,9 @@ Django will then include the extra attributes in the rendered output: >>> f = CommentForm(auto_id=False) >>> f.as_table() - <tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr> - <tr><th>Url:</th><td><input type="url" name="url"/></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" size="40"/></td></tr> + <tr><th>Name:</th><td><input type="text" name="name" class="special" required /></td></tr> + <tr><th>Url:</th><td><input type="url" name="url" required /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" size="40" required /></td></tr> You can also set the HTML ``id`` using :attr:`~Widget.attrs`. See :attr:`BoundField.id_for_label` for an example. @@ -204,7 +204,7 @@ foundation for custom widgets. >>> from django import forms >>> name = forms.TextInput(attrs={'size': 10, 'title': 'Your name',}) >>> name.render('name', 'A name') - '<input title="Your name" type="text" name="name" value="A name" size="10" />' + '<input title="Your name" type="text" name="name" value="A name" size="10" required />' If you assign a value of ``True`` or ``False`` to an attribute, it will be rendered as an HTML5 boolean attribute:: @@ -627,16 +627,16 @@ Selector and checkbox widgets .. code-block:: html <div class="myradio"> - <label for="id_beatles_0"><input id="id_beatles_0" name="beatles" type="radio" value="john" /> John</label> + <label for="id_beatles_0"><input id="id_beatles_0" name="beatles" type="radio" value="john" required /> John</label> </div> <div class="myradio"> - <label for="id_beatles_1"><input id="id_beatles_1" name="beatles" type="radio" value="paul" /> Paul</label> + <label for="id_beatles_1"><input id="id_beatles_1" name="beatles" type="radio" value="paul" required /> Paul</label> </div> <div class="myradio"> - <label for="id_beatles_2"><input id="id_beatles_2" name="beatles" type="radio" value="george" /> George</label> + <label for="id_beatles_2"><input id="id_beatles_2" name="beatles" type="radio" value="george" required /> George</label> </div> <div class="myradio"> - <label for="id_beatles_3"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" /> Ringo</label> + <label for="id_beatles_3"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" required /> Ringo</label> </div> That included the ``<label>`` tags. To get more granular, you can use each @@ -658,22 +658,22 @@ Selector and checkbox widgets <label for="id_beatles_0"> John - <span class="radio"><input id="id_beatles_0" name="beatles" type="radio" value="john" /></span> + <span class="radio"><input id="id_beatles_0" name="beatles" type="radio" value="john" required /></span> </label> <label for="id_beatles_1"> Paul - <span class="radio"><input id="id_beatles_1" name="beatles" type="radio" value="paul" /></span> + <span class="radio"><input id="id_beatles_1" name="beatles" type="radio" value="paul" required /></span> </label> <label for="id_beatles_2"> George - <span class="radio"><input id="id_beatles_2" name="beatles" type="radio" value="george" /></span> + <span class="radio"><input id="id_beatles_2" name="beatles" type="radio" value="george" required /></span> </label> <label for="id_beatles_3"> Ringo - <span class="radio"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" /></span> + <span class="radio"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" required /></span> </label> If you decide not to loop over the radio buttons -- e.g., if your template |
