parent
c47fa3b481
commit
4f16376274
|
@ -18,10 +18,12 @@ from io import BytesIO
|
||||||
from django.core import validators
|
from django.core import validators
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.forms.util import ErrorList, from_current_timezone, to_current_timezone
|
from django.forms.util import ErrorList, from_current_timezone, to_current_timezone
|
||||||
from django.forms.widgets import (TextInput, PasswordInput, HiddenInput,
|
from django.forms.widgets import (
|
||||||
|
TextInput, PasswordInput, EmailInput, HiddenInput,
|
||||||
MultipleHiddenInput, ClearableFileInput, CheckboxInput, Select,
|
MultipleHiddenInput, ClearableFileInput, CheckboxInput, Select,
|
||||||
NullBooleanSelect, SelectMultiple, DateInput, DateTimeInput, TimeInput,
|
NullBooleanSelect, SelectMultiple, DateInput, DateTimeInput, TimeInput,
|
||||||
SplitDateTimeWidget, SplitHiddenDateTimeWidget, FILE_INPUT_CONTRADICTION)
|
SplitDateTimeWidget, SplitHiddenDateTimeWidget, FILE_INPUT_CONTRADICTION
|
||||||
|
)
|
||||||
from django.utils import formats
|
from django.utils import formats
|
||||||
from django.utils.encoding import smart_text, force_str, force_text
|
from django.utils.encoding import smart_text, force_str, force_text
|
||||||
from django.utils.ipv6 import clean_ipv6_address
|
from django.utils.ipv6 import clean_ipv6_address
|
||||||
|
@ -487,6 +489,7 @@ class RegexField(CharField):
|
||||||
regex = property(_get_regex, _set_regex)
|
regex = property(_get_regex, _set_regex)
|
||||||
|
|
||||||
class EmailField(CharField):
|
class EmailField(CharField):
|
||||||
|
widget = EmailInput
|
||||||
default_error_messages = {
|
default_error_messages = {
|
||||||
'invalid': _('Enter a valid email address.'),
|
'invalid': _('Enter a valid email address.'),
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ from django.utils.safestring import mark_safe
|
||||||
from django.utils import datetime_safe, formats, six
|
from django.utils import datetime_safe, formats, six
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'PasswordInput',
|
'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'EmailInput', 'PasswordInput',
|
||||||
'HiddenInput', 'MultipleHiddenInput', 'ClearableFileInput',
|
'HiddenInput', 'MultipleHiddenInput', 'ClearableFileInput',
|
||||||
'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
|
'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
|
||||||
'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
|
'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
|
||||||
|
@ -251,6 +251,10 @@ class TextInput(Input):
|
||||||
super(TextInput, self).__init__(attrs)
|
super(TextInput, self).__init__(attrs)
|
||||||
|
|
||||||
|
|
||||||
|
class EmailInput(TextInput):
|
||||||
|
input_type = 'email'
|
||||||
|
|
||||||
|
|
||||||
class PasswordInput(TextInput):
|
class PasswordInput(TextInput):
|
||||||
input_type = 'password'
|
input_type = 'password'
|
||||||
|
|
||||||
|
|
|
@ -270,7 +270,7 @@ simply ``print`` it::
|
||||||
>>> print(f)
|
>>> 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_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_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="text" name="sender" id="id_sender" /></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_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>
|
<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>
|
||||||
|
|
||||||
If the form is bound to data, the HTML output will include that data
|
If the form is bound to data, the HTML output will include that data
|
||||||
|
@ -287,7 +287,7 @@ include ``checked="checked"`` if appropriate::
|
||||||
>>> print(f)
|
>>> 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_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_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="text" name="sender" id="id_sender" value="foo@example.com" /></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_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" checked="checked" /></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.
|
This default output is a two-column HTML table, with a ``<tr>`` for each field.
|
||||||
|
@ -297,8 +297,9 @@ Notice the following:
|
||||||
``</table>`` tags, nor does it include the ``<form>`` and ``</form>``
|
``</table>`` tags, nor does it include the ``<form>`` and ``</form>``
|
||||||
tags or an ``<input type="submit">`` tag. It's your job to do that.
|
tags or an ``<input type="submit">`` tag. It's your job to do that.
|
||||||
|
|
||||||
* Each field type has a default HTML representation. ``CharField`` and
|
* Each field type has a default HTML representation. ``CharField`` is
|
||||||
``EmailField`` are represented by an ``<input type="text">``.
|
represented by an ``<input type="text">`` and ``EmailField`` by an
|
||||||
|
``<input type="email">``.
|
||||||
``BooleanField`` is represented by an ``<input type="checkbox">``. Note
|
``BooleanField`` is represented by an ``<input type="checkbox">``. Note
|
||||||
these are merely sensible defaults; you can specify which HTML to use for
|
these are merely sensible defaults; you can specify which HTML to use for
|
||||||
a given field by using widgets, which we'll explain shortly.
|
a given field by using widgets, which we'll explain shortly.
|
||||||
|
@ -335,7 +336,7 @@ a form object, and each rendering method returns a Unicode object.
|
||||||
>>> print(f.as_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_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_message">Message:</label> <input type="text" name="message" id="id_message" /></p>
|
||||||
<p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p>
|
<p><label for="id_sender">Sender:</label> <input type="email" name="sender" id="id_sender" /></p>
|
||||||
<p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>
|
<p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>
|
||||||
|
|
||||||
``as_ul()``
|
``as_ul()``
|
||||||
|
@ -350,11 +351,11 @@ a form object, and each rendering method returns a Unicode object.
|
||||||
|
|
||||||
>>> f = ContactForm()
|
>>> f = ContactForm()
|
||||||
>>> f.as_ul()
|
>>> f.as_ul()
|
||||||
u'<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="text" 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>'
|
u'<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>'
|
||||||
>>> print(f.as_ul())
|
>>> 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_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_message">Message:</label> <input type="text" name="message" id="id_message" /></li>
|
||||||
<li><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></li>
|
<li><label for="id_sender">Sender:</label> <input type="email" name="sender" id="id_sender" /></li>
|
||||||
<li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li>
|
<li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li>
|
||||||
|
|
||||||
``as_table()``
|
``as_table()``
|
||||||
|
@ -368,11 +369,11 @@ a form object, and each rendering method returns a Unicode object.
|
||||||
|
|
||||||
>>> f = ContactForm()
|
>>> f = ContactForm()
|
||||||
>>> f.as_table()
|
>>> f.as_table()
|
||||||
u'<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="text" 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>'
|
u'<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>'
|
||||||
>>> print(f.as_table())
|
>>> 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_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_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="text" name="sender" id="id_sender" /></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_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>
|
<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>
|
||||||
|
|
||||||
Styling required or erroneous form rows
|
Styling required or erroneous form rows
|
||||||
|
@ -431,17 +432,17 @@ tags nor ``id`` attributes::
|
||||||
>>> print(f.as_table())
|
>>> print(f.as_table())
|
||||||
<tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /></td></tr>
|
<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>Message:</th><td><input type="text" name="message" /></td></tr>
|
||||||
<tr><th>Sender:</th><td><input type="text" name="sender" /></td></tr>
|
<tr><th>Sender:</th><td><input type="email" name="sender" /></td></tr>
|
||||||
<tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr>
|
<tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr>
|
||||||
>>> print(f.as_ul())
|
>>> print(f.as_ul())
|
||||||
<li>Subject: <input type="text" name="subject" maxlength="100" /></li>
|
<li>Subject: <input type="text" name="subject" maxlength="100" /></li>
|
||||||
<li>Message: <input type="text" name="message" /></li>
|
<li>Message: <input type="text" name="message" /></li>
|
||||||
<li>Sender: <input type="text" name="sender" /></li>
|
<li>Sender: <input type="email" name="sender" /></li>
|
||||||
<li>Cc myself: <input type="checkbox" name="cc_myself" /></li>
|
<li>Cc myself: <input type="checkbox" name="cc_myself" /></li>
|
||||||
>>> print(f.as_p())
|
>>> print(f.as_p())
|
||||||
<p>Subject: <input type="text" name="subject" maxlength="100" /></p>
|
<p>Subject: <input type="text" name="subject" maxlength="100" /></p>
|
||||||
<p>Message: <input type="text" name="message" /></p>
|
<p>Message: <input type="text" name="message" /></p>
|
||||||
<p>Sender: <input type="text" name="sender" /></p>
|
<p>Sender: <input type="email" name="sender" /></p>
|
||||||
<p>Cc myself: <input type="checkbox" name="cc_myself" /></p>
|
<p>Cc myself: <input type="checkbox" name="cc_myself" /></p>
|
||||||
|
|
||||||
If ``auto_id`` is set to ``True``, then the form output *will* include
|
If ``auto_id`` is set to ``True``, then the form output *will* include
|
||||||
|
@ -452,17 +453,17 @@ field::
|
||||||
>>> print(f.as_table())
|
>>> 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="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="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="text" name="sender" id="sender" /></td></tr>
|
<tr><th><label for="sender">Sender:</label></th><td><input type="email" name="sender" id="sender" /></td></tr>
|
||||||
<tr><th><label for="cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="cc_myself" /></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())
|
>>> print(f.as_ul())
|
||||||
<li><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></li>
|
<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="message">Message:</label> <input type="text" name="message" id="message" /></li>
|
||||||
<li><label for="sender">Sender:</label> <input type="text" name="sender" id="sender" /></li>
|
<li><label for="sender">Sender:</label> <input type="email" name="sender" id="sender" /></li>
|
||||||
<li><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></li>
|
<li><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></li>
|
||||||
>>> print(f.as_p())
|
>>> print(f.as_p())
|
||||||
<p><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></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="message">Message:</label> <input type="text" name="message" id="message" /></p>
|
||||||
<p><label for="sender">Sender:</label> <input type="text" name="sender" id="sender" /></p>
|
<p><label for="sender">Sender:</label> <input type="email" name="sender" id="sender" /></p>
|
||||||
<p><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></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'``,
|
If ``auto_id`` is set to a string containing the format character ``'%s'``,
|
||||||
|
@ -475,17 +476,17 @@ attributes based on the format string. For example, for a format string
|
||||||
>>> print(f.as_table())
|
>>> 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_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_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="text" name="sender" id="id_for_sender" /></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_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></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())
|
>>> 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_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_message">Message:</label> <input type="text" name="message" id="id_for_message" /></li>
|
||||||
<li><label for="id_for_sender">Sender:</label> <input type="text" name="sender" id="id_for_sender" /></li>
|
<li><label for="id_for_sender">Sender:</label> <input type="email" name="sender" id="id_for_sender" /></li>
|
||||||
<li><label for="id_for_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></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())
|
>>> 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_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_message">Message:</label> <input type="text" name="message" id="id_for_message" /></p>
|
||||||
<p><label for="id_for_sender">Sender:</label> <input type="text" name="sender" id="id_for_sender" /></p>
|
<p><label for="id_for_sender">Sender:</label> <input type="email" name="sender" id="id_for_sender" /></p>
|
||||||
<p><label for="id_for_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></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
|
If ``auto_id`` is set to any other true value -- such as a string that doesn't
|
||||||
|
@ -501,13 +502,13 @@ entirely, using the ``label_suffix`` parameter::
|
||||||
>>> print(f.as_ul())
|
>>> 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_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_message">Message</label> <input type="text" name="message" id="id_for_message" /></li>
|
||||||
<li><label for="id_for_sender">Sender</label> <input type="text" name="sender" id="id_for_sender" /></li>
|
<li><label for="id_for_sender">Sender</label> <input type="email" name="sender" id="id_for_sender" /></li>
|
||||||
<li><label for="id_for_cc_myself">Cc myself</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></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=' ->')
|
>>> f = ContactForm(auto_id='id_for_%s', label_suffix=' ->')
|
||||||
>>> print(f.as_ul())
|
>>> 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_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_message">Message -></label> <input type="text" name="message" id="id_for_message" /></li>
|
||||||
<li><label for="id_for_sender">Sender -></label> <input type="text" name="sender" id="id_for_sender" /></li>
|
<li><label for="id_for_sender">Sender -></label> <input type="email" name="sender" id="id_for_sender" /></li>
|
||||||
<li><label for="id_for_cc_myself">Cc myself -></label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></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
|
Note that the label suffix is added only if the last character of the
|
||||||
|
@ -539,19 +540,19 @@ method you're using::
|
||||||
>>> print(f.as_table())
|
>>> 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>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>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="text" name="sender" value="invalid email address" /></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>Cc myself:</th><td><input checked="checked" type="checkbox" name="cc_myself" /></td></tr>
|
<tr><th>Cc myself:</th><td><input checked="checked" type="checkbox" name="cc_myself" /></td></tr>
|
||||||
>>> print(f.as_ul())
|
>>> 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><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>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="text" name="sender" value="invalid email address" /></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>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></li>
|
<li>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></li>
|
||||||
>>> print(f.as_p())
|
>>> print(f.as_p())
|
||||||
<p><ul class="errorlist"><li>This field is required.</li></ul></p>
|
<p><ul class="errorlist"><li>This field is required.</li></ul></p>
|
||||||
<p>Subject: <input type="text" name="subject" maxlength="100" /></p>
|
<p>Subject: <input type="text" name="subject" maxlength="100" /></p>
|
||||||
<p>Message: <input type="text" name="message" value="Hi there" /></p>
|
<p>Message: <input type="text" name="message" value="Hi there" /></p>
|
||||||
<p><ul class="errorlist"><li>Enter a valid email address.</li></ul></p>
|
<p><ul class="errorlist"><li>Enter a valid email address.</li></ul></p>
|
||||||
<p>Sender: <input type="text" name="sender" value="invalid email address" /></p>
|
<p>Sender: <input type="email" name="sender" value="invalid email address" /></p>
|
||||||
<p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p>
|
<p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p>
|
||||||
|
|
||||||
Customizing the error list format
|
Customizing the error list format
|
||||||
|
@ -574,7 +575,7 @@ pass that in at construction time::
|
||||||
<p>Subject: <input type="text" name="subject" maxlength="100" /></p>
|
<p>Subject: <input type="text" name="subject" maxlength="100" /></p>
|
||||||
<p>Message: <input type="text" name="message" value="Hi there" /></p>
|
<p>Message: <input type="text" name="message" value="Hi there" /></p>
|
||||||
<div class="errorlist"><div class="error">Enter a valid email address.</div></div>
|
<div class="errorlist"><div class="error">Enter a valid email address.</div></div>
|
||||||
<p>Sender: <input type="text" name="sender" value="invalid email address" /></p>
|
<p>Sender: <input type="email" name="sender" value="invalid email address" /></p>
|
||||||
<p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p>
|
<p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p>
|
||||||
|
|
||||||
More granular output
|
More granular output
|
||||||
|
@ -604,7 +605,7 @@ To retrieve all ``BoundField`` objects, iterate the form::
|
||||||
>>> for boundfield in form: print(boundfield)
|
>>> for boundfield in form: print(boundfield)
|
||||||
<input id="id_subject" type="text" name="subject" maxlength="100" />
|
<input id="id_subject" type="text" name="subject" maxlength="100" />
|
||||||
<input type="text" name="message" id="id_message" />
|
<input type="text" name="message" id="id_message" />
|
||||||
<input type="text" name="sender" id="id_sender" />
|
<input type="email" name="sender" id="id_sender" />
|
||||||
<input type="checkbox" name="cc_myself" id="id_cc_myself" />
|
<input type="checkbox" name="cc_myself" id="id_cc_myself" />
|
||||||
|
|
||||||
The field-specific output honors the form object's ``auto_id`` setting::
|
The field-specific output honors the form object's ``auto_id`` setting::
|
||||||
|
@ -756,7 +757,7 @@ fields are ordered first::
|
||||||
>>> print(f.as_ul())
|
>>> print(f.as_ul())
|
||||||
<li>Subject: <input type="text" name="subject" maxlength="100" /></li>
|
<li>Subject: <input type="text" name="subject" maxlength="100" /></li>
|
||||||
<li>Message: <input type="text" name="message" /></li>
|
<li>Message: <input type="text" name="message" /></li>
|
||||||
<li>Sender: <input type="text" name="sender" /></li>
|
<li>Sender: <input type="email" name="sender" /></li>
|
||||||
<li>Cc myself: <input type="checkbox" name="cc_myself" /></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" /></li>
|
||||||
|
|
||||||
|
|
|
@ -212,17 +212,17 @@ fields. We've specified ``auto_id=False`` to simplify the output::
|
||||||
>>> print(f.as_table())
|
>>> 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>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>Message:</th><td><input type="text" name="message" /></td></tr>
|
||||||
<tr><th>Sender:</th><td><input type="text" name="sender" /><br />A valid email address, please.</td></tr>
|
<tr><th>Sender:</th><td><input type="email" name="sender" /><br />A valid email address, please.</td></tr>
|
||||||
<tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr>
|
<tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr>
|
||||||
>>> print(f.as_ul()))
|
>>> print(f.as_ul()))
|
||||||
<li>Subject: <input type="text" name="subject" maxlength="100" /> <span class="helptext">100 characters max.</span></li>
|
<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>Message: <input type="text" name="message" /></li>
|
||||||
<li>Sender: <input type="text" name="sender" /> A valid email address, please.</li>
|
<li>Sender: <input type="email" name="sender" /> A valid email address, please.</li>
|
||||||
<li>Cc myself: <input type="checkbox" name="cc_myself" /></li>
|
<li>Cc myself: <input type="checkbox" name="cc_myself" /></li>
|
||||||
>>> print(f.as_p())
|
>>> print(f.as_p())
|
||||||
<p>Subject: <input type="text" name="subject" maxlength="100" /> <span class="helptext">100 characters max.</span></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>Message: <input type="text" name="message" /></p>
|
||||||
<p>Sender: <input type="text" name="sender" /> A valid email address, please.</p>
|
<p>Sender: <input type="email" name="sender" /> A valid email address, please.</p>
|
||||||
<p>Cc myself: <input type="checkbox" name="cc_myself" /></p>
|
<p>Cc myself: <input type="checkbox" name="cc_myself" /></p>
|
||||||
|
|
||||||
``error_messages``
|
``error_messages``
|
||||||
|
@ -489,7 +489,7 @@ For each field, we describe the default widget used if you don't specify
|
||||||
|
|
||||||
.. class:: EmailField(**kwargs)
|
.. class:: EmailField(**kwargs)
|
||||||
|
|
||||||
* Default widget: :class:`TextInput`
|
* Default widget: :class:`EmailInput`
|
||||||
* Empty value: ``''`` (an empty string)
|
* Empty value: ``''`` (an empty string)
|
||||||
* Normalizes to: A Unicode object.
|
* Normalizes to: A Unicode object.
|
||||||
* Validates that the given value is a valid email address, using a
|
* Validates that the given value is a valid email address, using a
|
||||||
|
|
|
@ -392,7 +392,16 @@ These widgets make use of the HTML elements ``input`` and ``textarea``.
|
||||||
|
|
||||||
.. class:: TextInput
|
.. class:: TextInput
|
||||||
|
|
||||||
Text input: ``<input type='text' ...>``
|
Text input: ``<input type="text" ...>``
|
||||||
|
|
||||||
|
``EmailInput``
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. class:: EmailInput
|
||||||
|
|
||||||
|
.. versionadded:: 1.6
|
||||||
|
|
||||||
|
Text input: ``<input type="email" ...>``
|
||||||
|
|
||||||
``PasswordInput``
|
``PasswordInput``
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
|
@ -31,6 +31,9 @@ Minor features
|
||||||
* Added :meth:`~django.db.models.query.QuerySet.earliest` for symmetry with
|
* Added :meth:`~django.db.models.query.QuerySet.earliest` for symmetry with
|
||||||
:meth:`~django.db.models.query.QuerySet.latest`.
|
:meth:`~django.db.models.query.QuerySet.latest`.
|
||||||
|
|
||||||
|
* The default widgets for :class:`~django.forms.EmailField` use
|
||||||
|
the new type attribute available in HTML5 (type='email').
|
||||||
|
|
||||||
Backwards incompatible changes in 1.6
|
Backwards incompatible changes in 1.6
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
|
@ -39,6 +42,10 @@ Backwards incompatible changes in 1.6
|
||||||
:meth:`~django.db.models.query.QuerySet.none` has been called:
|
:meth:`~django.db.models.query.QuerySet.none` has been called:
|
||||||
``isinstance(qs.none(), EmptyQuerySet)``
|
``isinstance(qs.none(), EmptyQuerySet)``
|
||||||
|
|
||||||
|
* If your CSS/Javascript code used to access HTML input widgets by type, you
|
||||||
|
should review it as ``type='text'`` widgets might be now output as
|
||||||
|
``type='email'`` depending on their corresponding field type.
|
||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|
||||||
In addition to the changes outlined in this section, be sure to review the
|
In addition to the changes outlined in this section, be sure to review the
|
||||||
|
|
|
@ -223,7 +223,7 @@ wrapped in a paragraph. Here's the output for our example template::
|
||||||
<p><label for="id_message">Message:</label>
|
<p><label for="id_message">Message:</label>
|
||||||
<input type="text" name="message" id="id_message" /></p>
|
<input type="text" name="message" id="id_message" /></p>
|
||||||
<p><label for="id_sender">Sender:</label>
|
<p><label for="id_sender">Sender:</label>
|
||||||
<input type="text" name="sender" id="id_sender" /></p>
|
<input type="email" name="sender" id="id_sender" /></p>
|
||||||
<p><label for="id_cc_myself">Cc myself:</label>
|
<p><label for="id_cc_myself">Cc myself:</label>
|
||||||
<input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>
|
<input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>
|
||||||
<input type="submit" value="Submit" />
|
<input type="submit" value="Submit" />
|
||||||
|
|
|
@ -631,7 +631,7 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
|
||||||
f = CommentForm(data, auto_id=False, error_class=DivErrorList)
|
f = CommentForm(data, auto_id=False, error_class=DivErrorList)
|
||||||
self.assertHTMLEqual(f.as_p(), """<p>Name: <input type="text" name="name" maxlength="50" /></p>
|
self.assertHTMLEqual(f.as_p(), """<p>Name: <input type="text" name="name" maxlength="50" /></p>
|
||||||
<div class="errorlist"><div class="error">Enter a valid email address.</div></div>
|
<div class="errorlist"><div class="error">Enter a valid email address.</div></div>
|
||||||
<p>Email: <input type="text" name="email" value="invalid" /></p>
|
<p>Email: <input type="email" name="email" value="invalid" /></p>
|
||||||
<div class="errorlist"><div class="error">This field is required.</div></div>
|
<div class="errorlist"><div class="error">This field is required.</div></div>
|
||||||
<p>Comment: <input type="text" name="comment" /></p>""")
|
<p>Comment: <input type="text" name="comment" /></p>""")
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,11 @@ def fix_os_paths(x):
|
||||||
|
|
||||||
class FieldsTests(SimpleTestCase):
|
class FieldsTests(SimpleTestCase):
|
||||||
|
|
||||||
|
def assertWidgetRendersTo(self, field, to):
|
||||||
|
class _Form(Form):
|
||||||
|
f = field
|
||||||
|
self.assertHTMLEqual(str(_Form()['f']), to)
|
||||||
|
|
||||||
def test_field_sets_widget_is_required(self):
|
def test_field_sets_widget_is_required(self):
|
||||||
self.assertTrue(Field(required=True).widget.is_required)
|
self.assertTrue(Field(required=True).widget.is_required)
|
||||||
self.assertFalse(Field(required=False).widget.is_required)
|
self.assertFalse(Field(required=False).widget.is_required)
|
||||||
|
@ -545,6 +550,7 @@ class FieldsTests(SimpleTestCase):
|
||||||
|
|
||||||
def test_emailfield_1(self):
|
def test_emailfield_1(self):
|
||||||
f = EmailField()
|
f = EmailField()
|
||||||
|
self.assertWidgetRendersTo(f, '<input type="email" name="f" id="id_f" />')
|
||||||
self.assertRaisesMessage(ValidationError, "'This field is required.'", f.clean, '')
|
self.assertRaisesMessage(ValidationError, "'This field is required.'", f.clean, '')
|
||||||
self.assertRaisesMessage(ValidationError, "'This field is required.'", f.clean, None)
|
self.assertRaisesMessage(ValidationError, "'This field is required.'", f.clean, None)
|
||||||
self.assertEqual('person@example.com', f.clean('person@example.com'))
|
self.assertEqual('person@example.com', f.clean('person@example.com'))
|
||||||
|
@ -569,6 +575,7 @@ class FieldsTests(SimpleTestCase):
|
||||||
|
|
||||||
def test_emailfield_min_max_length(self):
|
def test_emailfield_min_max_length(self):
|
||||||
f = EmailField(min_length=10, max_length=15)
|
f = EmailField(min_length=10, max_length=15)
|
||||||
|
self.assertWidgetRendersTo(f, '<input id="id_f" type="email" name="f" maxlength="15" />')
|
||||||
self.assertRaisesMessage(ValidationError, "'Ensure this value has at least 10 characters (it has 9).'", f.clean, 'a@foo.com')
|
self.assertRaisesMessage(ValidationError, "'Ensure this value has at least 10 characters (it has 9).'", f.clean, 'a@foo.com')
|
||||||
self.assertEqual('alf@foo.com', f.clean('alf@foo.com'))
|
self.assertEqual('alf@foo.com', f.clean('alf@foo.com'))
|
||||||
self.assertRaisesMessage(ValidationError, "'Ensure this value has at most 15 characters (it has 20).'", f.clean, 'alf123456788@foo.com')
|
self.assertRaisesMessage(ValidationError, "'Ensure this value has at most 15 characters (it has 20).'", f.clean, 'alf123456788@foo.com')
|
||||||
|
|
|
@ -245,11 +245,11 @@ class FormsTestCase(TestCase):
|
||||||
get_spam = BooleanField()
|
get_spam = BooleanField()
|
||||||
|
|
||||||
f = SignupForm(auto_id=False)
|
f = SignupForm(auto_id=False)
|
||||||
self.assertHTMLEqual(str(f['email']), '<input type="text" name="email" />')
|
self.assertHTMLEqual(str(f['email']), '<input type="email" name="email" />')
|
||||||
self.assertHTMLEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />')
|
self.assertHTMLEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />')
|
||||||
|
|
||||||
f = SignupForm({'email': 'test@example.com', 'get_spam': True}, auto_id=False)
|
f = SignupForm({'email': 'test@example.com', 'get_spam': True}, auto_id=False)
|
||||||
self.assertHTMLEqual(str(f['email']), '<input type="text" name="email" value="test@example.com" />')
|
self.assertHTMLEqual(str(f['email']), '<input type="email" name="email" value="test@example.com" />')
|
||||||
self.assertHTMLEqual(str(f['get_spam']), '<input checked="checked" type="checkbox" name="get_spam" />')
|
self.assertHTMLEqual(str(f['get_spam']), '<input checked="checked" type="checkbox" name="get_spam" />')
|
||||||
|
|
||||||
# 'True' or 'true' should be rendered without a value attribute
|
# 'True' or 'true' should be rendered without a value attribute
|
||||||
|
@ -1739,7 +1739,7 @@ class FormsTestCase(TestCase):
|
||||||
<option value="2">Yes</option>
|
<option value="2">Yes</option>
|
||||||
<option value="3">No</option>
|
<option value="3">No</option>
|
||||||
</select></li>
|
</select></li>
|
||||||
<li><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></li>
|
<li><label for="id_email">Email:</label> <input type="email" name="email" id="id_email" /></li>
|
||||||
<li class="required error"><ul class="errorlist"><li>This field is required.</li></ul><label for="id_age">Age:</label> <input type="text" name="age" id="id_age" /></li>""")
|
<li class="required error"><ul class="errorlist"><li>This field is required.</li></ul><label for="id_age">Age:</label> <input type="text" name="age" id="id_age" /></li>""")
|
||||||
|
|
||||||
self.assertHTMLEqual(p.as_p(), """<ul class="errorlist"><li>This field is required.</li></ul>
|
self.assertHTMLEqual(p.as_p(), """<ul class="errorlist"><li>This field is required.</li></ul>
|
||||||
|
@ -1749,7 +1749,7 @@ class FormsTestCase(TestCase):
|
||||||
<option value="2">Yes</option>
|
<option value="2">Yes</option>
|
||||||
<option value="3">No</option>
|
<option value="3">No</option>
|
||||||
</select></p>
|
</select></p>
|
||||||
<p><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></p>
|
<p><label for="id_email">Email:</label> <input type="email" name="email" id="id_email" /></p>
|
||||||
<ul class="errorlist"><li>This field is required.</li></ul>
|
<ul class="errorlist"><li>This field is required.</li></ul>
|
||||||
<p class="required error"><label for="id_age">Age:</label> <input type="text" name="age" id="id_age" /></p>""")
|
<p class="required error"><label for="id_age">Age:</label> <input type="text" name="age" id="id_age" /></p>""")
|
||||||
|
|
||||||
|
@ -1759,7 +1759,7 @@ class FormsTestCase(TestCase):
|
||||||
<option value="2">Yes</option>
|
<option value="2">Yes</option>
|
||||||
<option value="3">No</option>
|
<option value="3">No</option>
|
||||||
</select></td></tr>
|
</select></td></tr>
|
||||||
<tr><th><label for="id_email">Email:</label></th><td><input type="text" name="email" id="id_email" /></td></tr>
|
<tr><th><label for="id_email">Email:</label></th><td><input type="email" name="email" id="id_email" /></td></tr>
|
||||||
<tr class="required error"><th><label for="id_age">Age:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="age" id="id_age" /></td></tr>""")
|
<tr class="required error"><th><label for="id_age">Age:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="age" id="id_age" /></td></tr>""")
|
||||||
|
|
||||||
def test_label_split_datetime_not_displayed(self):
|
def test_label_split_datetime_not_displayed(self):
|
||||||
|
|
Loading…
Reference in New Issue