Fixed #5546: split form unit tests into manageable chunks. This isn't a perfect fix since the chunks aren't yet autodiscovered, but that shouldn't prevent checking this in. Thanks, Leo Soto.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@6379 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
980fa8b827
commit
35fa1f4d8e
|
@ -0,0 +1,398 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
tests = r"""
|
||||||
|
>>> from django.newforms import *
|
||||||
|
>>> import datetime
|
||||||
|
>>> import time
|
||||||
|
>>> import re
|
||||||
|
>>> try:
|
||||||
|
... from decimal import Decimal
|
||||||
|
... except ImportError:
|
||||||
|
... from django.utils._decimal import Decimal
|
||||||
|
|
||||||
|
###############
|
||||||
|
# Extra stuff #
|
||||||
|
###############
|
||||||
|
|
||||||
|
The newforms library comes with some extra, higher-level Field and Widget
|
||||||
|
classes that demonstrate some of the library's abilities.
|
||||||
|
|
||||||
|
# SelectDateWidget ############################################################
|
||||||
|
|
||||||
|
>>> from django.newforms.extras import SelectDateWidget
|
||||||
|
>>> w = SelectDateWidget(years=('2007','2008','2009','2010','2011','2012','2013','2014','2015','2016'))
|
||||||
|
>>> print w.render('mydate', '')
|
||||||
|
<select name="mydate_month">
|
||||||
|
<option value="1">January</option>
|
||||||
|
<option value="2">February</option>
|
||||||
|
<option value="3">March</option>
|
||||||
|
<option value="4">April</option>
|
||||||
|
<option value="5">May</option>
|
||||||
|
<option value="6">June</option>
|
||||||
|
<option value="7">July</option>
|
||||||
|
<option value="8">August</option>
|
||||||
|
<option value="9">September</option>
|
||||||
|
<option value="10">October</option>
|
||||||
|
<option value="11">November</option>
|
||||||
|
<option value="12">December</option>
|
||||||
|
</select>
|
||||||
|
<select name="mydate_day">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
<option value="4">4</option>
|
||||||
|
<option value="5">5</option>
|
||||||
|
<option value="6">6</option>
|
||||||
|
<option value="7">7</option>
|
||||||
|
<option value="8">8</option>
|
||||||
|
<option value="9">9</option>
|
||||||
|
<option value="10">10</option>
|
||||||
|
<option value="11">11</option>
|
||||||
|
<option value="12">12</option>
|
||||||
|
<option value="13">13</option>
|
||||||
|
<option value="14">14</option>
|
||||||
|
<option value="15">15</option>
|
||||||
|
<option value="16">16</option>
|
||||||
|
<option value="17">17</option>
|
||||||
|
<option value="18">18</option>
|
||||||
|
<option value="19">19</option>
|
||||||
|
<option value="20">20</option>
|
||||||
|
<option value="21">21</option>
|
||||||
|
<option value="22">22</option>
|
||||||
|
<option value="23">23</option>
|
||||||
|
<option value="24">24</option>
|
||||||
|
<option value="25">25</option>
|
||||||
|
<option value="26">26</option>
|
||||||
|
<option value="27">27</option>
|
||||||
|
<option value="28">28</option>
|
||||||
|
<option value="29">29</option>
|
||||||
|
<option value="30">30</option>
|
||||||
|
<option value="31">31</option>
|
||||||
|
</select>
|
||||||
|
<select name="mydate_year">
|
||||||
|
<option value="2007">2007</option>
|
||||||
|
<option value="2008">2008</option>
|
||||||
|
<option value="2009">2009</option>
|
||||||
|
<option value="2010">2010</option>
|
||||||
|
<option value="2011">2011</option>
|
||||||
|
<option value="2012">2012</option>
|
||||||
|
<option value="2013">2013</option>
|
||||||
|
<option value="2014">2014</option>
|
||||||
|
<option value="2015">2015</option>
|
||||||
|
<option value="2016">2016</option>
|
||||||
|
</select>
|
||||||
|
>>> w.render('mydate', None) == w.render('mydate', '')
|
||||||
|
True
|
||||||
|
>>> print w.render('mydate', '2010-04-15')
|
||||||
|
<select name="mydate_month">
|
||||||
|
<option value="1">January</option>
|
||||||
|
<option value="2">February</option>
|
||||||
|
<option value="3">March</option>
|
||||||
|
<option value="4" selected="selected">April</option>
|
||||||
|
<option value="5">May</option>
|
||||||
|
<option value="6">June</option>
|
||||||
|
<option value="7">July</option>
|
||||||
|
<option value="8">August</option>
|
||||||
|
<option value="9">September</option>
|
||||||
|
<option value="10">October</option>
|
||||||
|
<option value="11">November</option>
|
||||||
|
<option value="12">December</option>
|
||||||
|
</select>
|
||||||
|
<select name="mydate_day">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
<option value="4">4</option>
|
||||||
|
<option value="5">5</option>
|
||||||
|
<option value="6">6</option>
|
||||||
|
<option value="7">7</option>
|
||||||
|
<option value="8">8</option>
|
||||||
|
<option value="9">9</option>
|
||||||
|
<option value="10">10</option>
|
||||||
|
<option value="11">11</option>
|
||||||
|
<option value="12">12</option>
|
||||||
|
<option value="13">13</option>
|
||||||
|
<option value="14">14</option>
|
||||||
|
<option value="15" selected="selected">15</option>
|
||||||
|
<option value="16">16</option>
|
||||||
|
<option value="17">17</option>
|
||||||
|
<option value="18">18</option>
|
||||||
|
<option value="19">19</option>
|
||||||
|
<option value="20">20</option>
|
||||||
|
<option value="21">21</option>
|
||||||
|
<option value="22">22</option>
|
||||||
|
<option value="23">23</option>
|
||||||
|
<option value="24">24</option>
|
||||||
|
<option value="25">25</option>
|
||||||
|
<option value="26">26</option>
|
||||||
|
<option value="27">27</option>
|
||||||
|
<option value="28">28</option>
|
||||||
|
<option value="29">29</option>
|
||||||
|
<option value="30">30</option>
|
||||||
|
<option value="31">31</option>
|
||||||
|
</select>
|
||||||
|
<select name="mydate_year">
|
||||||
|
<option value="2007">2007</option>
|
||||||
|
<option value="2008">2008</option>
|
||||||
|
<option value="2009">2009</option>
|
||||||
|
<option value="2010" selected="selected">2010</option>
|
||||||
|
<option value="2011">2011</option>
|
||||||
|
<option value="2012">2012</option>
|
||||||
|
<option value="2013">2013</option>
|
||||||
|
<option value="2014">2014</option>
|
||||||
|
<option value="2015">2015</option>
|
||||||
|
<option value="2016">2016</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
Using a SelectDateWidget in a form:
|
||||||
|
|
||||||
|
>>> class GetDate(Form):
|
||||||
|
... mydate = DateField(widget=SelectDateWidget)
|
||||||
|
>>> a = GetDate({'mydate_month':'4', 'mydate_day':'1', 'mydate_year':'2008'})
|
||||||
|
>>> print a.is_valid()
|
||||||
|
True
|
||||||
|
>>> print a.cleaned_data['mydate']
|
||||||
|
2008-04-01
|
||||||
|
|
||||||
|
As with any widget that implements get_value_from_datadict,
|
||||||
|
we must be prepared to accept the input from the "as_hidden"
|
||||||
|
rendering as well.
|
||||||
|
|
||||||
|
>>> print a['mydate'].as_hidden()
|
||||||
|
<input type="hidden" name="mydate" value="2008-4-1" id="id_mydate" />
|
||||||
|
>>> b=GetDate({'mydate':'2008-4-1'})
|
||||||
|
>>> print b.is_valid()
|
||||||
|
True
|
||||||
|
>>> print b.cleaned_data['mydate']
|
||||||
|
2008-04-01
|
||||||
|
|
||||||
|
|
||||||
|
# MultiWidget and MultiValueField #############################################
|
||||||
|
# MultiWidgets are widgets composed of other widgets. They are usually
|
||||||
|
# combined with MultiValueFields - a field that is composed of other fields.
|
||||||
|
# MulitWidgets can themselved be composed of other MultiWidgets.
|
||||||
|
# SplitDateTimeWidget is one example of a MultiWidget.
|
||||||
|
|
||||||
|
>>> class ComplexMultiWidget(MultiWidget):
|
||||||
|
... def __init__(self, attrs=None):
|
||||||
|
... widgets = (
|
||||||
|
... TextInput(),
|
||||||
|
... SelectMultiple(choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))),
|
||||||
|
... SplitDateTimeWidget(),
|
||||||
|
... )
|
||||||
|
... super(ComplexMultiWidget, self).__init__(widgets, attrs)
|
||||||
|
...
|
||||||
|
... def decompress(self, value):
|
||||||
|
... if value:
|
||||||
|
... data = value.split(',')
|
||||||
|
... return [data[0], data[1], datetime.datetime(*time.strptime(data[2], "%Y-%m-%d %H:%M:%S")[0:6])]
|
||||||
|
... return [None, None, None]
|
||||||
|
... def format_output(self, rendered_widgets):
|
||||||
|
... return u'\n'.join(rendered_widgets)
|
||||||
|
>>> w = ComplexMultiWidget()
|
||||||
|
>>> print w.render('name', 'some text,JP,2007-04-25 06:24:00')
|
||||||
|
<input type="text" name="name_0" value="some text" />
|
||||||
|
<select multiple="multiple" name="name_1">
|
||||||
|
<option value="J" selected="selected">John</option>
|
||||||
|
<option value="P" selected="selected">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
<input type="text" name="name_2_0" value="2007-04-25" /><input type="text" name="name_2_1" value="06:24:00" />
|
||||||
|
|
||||||
|
>>> class ComplexField(MultiValueField):
|
||||||
|
... def __init__(self, required=True, widget=None, label=None, initial=None):
|
||||||
|
... fields = (
|
||||||
|
... CharField(),
|
||||||
|
... MultipleChoiceField(choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))),
|
||||||
|
... SplitDateTimeField()
|
||||||
|
... )
|
||||||
|
... super(ComplexField, self).__init__(fields, required, widget, label, initial)
|
||||||
|
...
|
||||||
|
... def compress(self, data_list):
|
||||||
|
... if data_list:
|
||||||
|
... return '%s,%s,%s' % (data_list[0],''.join(data_list[1]),data_list[2])
|
||||||
|
... return None
|
||||||
|
|
||||||
|
>>> f = ComplexField(widget=w)
|
||||||
|
>>> f.clean(['some text', ['J','P'], ['2007-04-25','6:24:00']])
|
||||||
|
u'some text,JP,2007-04-25 06:24:00'
|
||||||
|
>>> f.clean(['some text',['X'], ['2007-04-25','6:24:00']])
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Select a valid choice. X is not one of the available choices.']
|
||||||
|
|
||||||
|
# If insufficient data is provided, None is substituted
|
||||||
|
>>> f.clean(['some text',['JP']])
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> class ComplexFieldForm(Form):
|
||||||
|
... field1 = ComplexField(widget=w)
|
||||||
|
>>> f = ComplexFieldForm()
|
||||||
|
>>> print f
|
||||||
|
<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" id="id_field1_0" />
|
||||||
|
<select multiple="multiple" name="field1_1" id="id_field1_1">
|
||||||
|
<option value="J">John</option>
|
||||||
|
<option value="P">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
<input type="text" name="field1_2_0" id="id_field1_2_0" /><input type="text" name="field1_2_1" id="id_field1_2_1" /></td></tr>
|
||||||
|
|
||||||
|
>>> f = ComplexFieldForm({'field1_0':'some text','field1_1':['J','P'], 'field1_2_0':'2007-04-25', 'field1_2_1':'06:24:00'})
|
||||||
|
>>> print f
|
||||||
|
<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" value="some text" id="id_field1_0" />
|
||||||
|
<select multiple="multiple" name="field1_1" id="id_field1_1">
|
||||||
|
<option value="J" selected="selected">John</option>
|
||||||
|
<option value="P" selected="selected">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
<input type="text" name="field1_2_0" value="2007-04-25" id="id_field1_2_0" /><input type="text" name="field1_2_1" value="06:24:00" id="id_field1_2_1" /></td></tr>
|
||||||
|
|
||||||
|
>>> f.cleaned_data
|
||||||
|
{'field1': u'some text,JP,2007-04-25 06:24:00'}
|
||||||
|
|
||||||
|
|
||||||
|
# IPAddressField ##################################################################
|
||||||
|
|
||||||
|
>>> f = IPAddressField()
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('127.0.0.1')
|
||||||
|
u'127.0.0.1'
|
||||||
|
>>> f.clean('foo')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid IPv4 address.']
|
||||||
|
>>> f.clean('127.0.0.')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid IPv4 address.']
|
||||||
|
>>> f.clean('1.2.3.4.5')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid IPv4 address.']
|
||||||
|
>>> f.clean('256.125.1.5')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid IPv4 address.']
|
||||||
|
|
||||||
|
>>> f = IPAddressField(required=False)
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('127.0.0.1')
|
||||||
|
u'127.0.0.1'
|
||||||
|
>>> f.clean('foo')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid IPv4 address.']
|
||||||
|
>>> f.clean('127.0.0.')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid IPv4 address.']
|
||||||
|
>>> f.clean('1.2.3.4.5')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid IPv4 address.']
|
||||||
|
>>> f.clean('256.125.1.5')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid IPv4 address.']
|
||||||
|
|
||||||
|
#################################
|
||||||
|
# Tests of underlying functions #
|
||||||
|
#################################
|
||||||
|
|
||||||
|
# smart_unicode tests
|
||||||
|
>>> from django.utils.encoding import smart_unicode
|
||||||
|
>>> class Test:
|
||||||
|
... def __str__(self):
|
||||||
|
... return 'ŠĐĆŽćžšđ'
|
||||||
|
>>> class TestU:
|
||||||
|
... def __str__(self):
|
||||||
|
... return 'Foo'
|
||||||
|
... def __unicode__(self):
|
||||||
|
... return u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111'
|
||||||
|
>>> smart_unicode(Test())
|
||||||
|
u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111'
|
||||||
|
>>> smart_unicode(TestU())
|
||||||
|
u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111'
|
||||||
|
>>> smart_unicode(1)
|
||||||
|
u'1'
|
||||||
|
>>> smart_unicode('foo')
|
||||||
|
u'foo'
|
||||||
|
|
||||||
|
|
||||||
|
####################################
|
||||||
|
# Test accessing errors in clean() #
|
||||||
|
####################################
|
||||||
|
|
||||||
|
>>> class UserForm(Form):
|
||||||
|
... username = CharField(max_length=10)
|
||||||
|
... password = CharField(widget=PasswordInput)
|
||||||
|
... def clean(self):
|
||||||
|
... data = self.cleaned_data
|
||||||
|
... if not self.errors:
|
||||||
|
... data['username'] = data['username'].lower()
|
||||||
|
... return data
|
||||||
|
|
||||||
|
>>> f = UserForm({'username': 'SirRobin', 'password': 'blue'})
|
||||||
|
>>> f.is_valid()
|
||||||
|
True
|
||||||
|
>>> f.cleaned_data['username']
|
||||||
|
u'sirrobin'
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Test overriding ErrorList in a form #
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
>>> from django.newforms.util import ErrorList
|
||||||
|
>>> class DivErrorList(ErrorList):
|
||||||
|
... def __unicode__(self):
|
||||||
|
... return self.as_divs()
|
||||||
|
... def as_divs(self):
|
||||||
|
... if not self: return u''
|
||||||
|
... return u'<div class="errorlist">%s</div>' % ''.join([u'<div class="error">%s</div>' % e for e in self])
|
||||||
|
>>> class CommentForm(Form):
|
||||||
|
... name = CharField(max_length=50, required=False)
|
||||||
|
... email = EmailField()
|
||||||
|
... comment = CharField()
|
||||||
|
>>> data = dict(email='invalid')
|
||||||
|
>>> f = CommentForm(data, auto_id=False, error_class=DivErrorList)
|
||||||
|
>>> print f.as_p()
|
||||||
|
<p>Name: <input type="text" name="name" maxlength="50" /></p>
|
||||||
|
<div class="errorlist"><div class="error">Enter a valid e-mail address.</div></div>
|
||||||
|
<p>Email: <input type="text" name="email" value="invalid" /></p>
|
||||||
|
<div class="errorlist"><div class="error">This field is required.</div></div>
|
||||||
|
<p>Comment: <input type="text" name="comment" /></p>
|
||||||
|
|
||||||
|
#################################
|
||||||
|
# Test multipart-encoded form #
|
||||||
|
#################################
|
||||||
|
|
||||||
|
>>> class FormWithoutFile(Form):
|
||||||
|
... username = CharField()
|
||||||
|
>>> class FormWithFile(Form):
|
||||||
|
... username = CharField()
|
||||||
|
... file = FileField()
|
||||||
|
>>> class FormWithImage(Form):
|
||||||
|
... image = ImageField()
|
||||||
|
|
||||||
|
>>> FormWithoutFile().is_multipart()
|
||||||
|
False
|
||||||
|
>>> FormWithFile().is_multipart()
|
||||||
|
True
|
||||||
|
>>> FormWithImage().is_multipart()
|
||||||
|
True
|
||||||
|
|
||||||
|
"""
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
|
@ -0,0 +1,294 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ AR form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# ARProvinceField #############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.ar.forms import ARProvinceSelect
|
||||||
|
>>> f = ARProvinceSelect()
|
||||||
|
>>> f.render('provincias', 'A')
|
||||||
|
u'<select name="provincias">\n<option value="B">Buenos Aires</option>\n<option value="K">Catamarca</option>\n<option value="H">Chaco</option>\n<option value="U">Chubut</option>\n<option value="C">Ciudad Aut\xf3noma de Buenos Aires</option>\n<option value="X">C\xf3rdoba</option>\n<option value="W">Corrientes</option>\n<option value="E">Entre R\xedos</option>\n<option value="P">Formosa</option>\n<option value="Y">Jujuy</option>\n<option value="L">La Pampa</option>\n<option value="F">La Rioja</option>\n<option value="M">Mendoza</option>\n<option value="N">Misiones</option>\n<option value="Q">Neuqu\xe9n</option>\n<option value="R">R\xedo Negro</option>\n<option value="A" selected="selected">Salta</option>\n<option value="J">San Juan</option>\n<option value="D">San Luis</option>\n<option value="Z">Santa Cruz</option>\n<option value="S">Santa Fe</option>\n<option value="G">Santiago del Estero</option>\n<option value="V">Tierra del Fuego, Ant\xe1rtida e Islas del Atl\xe1ntico Sur</option>\n<option value="T">Tucum\xe1n</option>\n</select>'
|
||||||
|
|
||||||
|
# ARPostalCodeField ###########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.ar.forms import ARPostalCodeField
|
||||||
|
>>> f = ARPostalCodeField()
|
||||||
|
>>> f.clean('5000')
|
||||||
|
u'5000'
|
||||||
|
>>> f.clean('C1064AAB')
|
||||||
|
u'C1064AAB'
|
||||||
|
>>> f.clean('c1064AAB')
|
||||||
|
u'C1064AAB'
|
||||||
|
>>> f.clean('C1064aab')
|
||||||
|
u'C1064AAB'
|
||||||
|
>>> f.clean(u'4400')
|
||||||
|
u'4400'
|
||||||
|
>>> f.clean(u'C1064AAB')
|
||||||
|
u'C1064AAB'
|
||||||
|
>>> f.clean('C1064AABB')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Ensure this value has at most 8 characters (it has 9).']
|
||||||
|
>>> f.clean('C1064AA')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
|
||||||
|
>>> f.clean('C106AAB')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
|
||||||
|
>>> f.clean('106AAB')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
|
||||||
|
>>> f.clean('500')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Ensure this value has at least 4 characters (it has 3).']
|
||||||
|
>>> f.clean('5PPP')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean(u'')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = ARPostalCodeField(required=False)
|
||||||
|
>>> f.clean('5000')
|
||||||
|
u'5000'
|
||||||
|
>>> f.clean('C1064AAB')
|
||||||
|
u'C1064AAB'
|
||||||
|
>>> f.clean('c1064AAB')
|
||||||
|
u'C1064AAB'
|
||||||
|
>>> f.clean('C1064aab')
|
||||||
|
u'C1064AAB'
|
||||||
|
>>> f.clean(u'4400')
|
||||||
|
u'4400'
|
||||||
|
>>> f.clean(u'C1064AAB')
|
||||||
|
u'C1064AAB'
|
||||||
|
>>> f.clean('C1064AABB')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Ensure this value has at most 8 characters (it has 9).']
|
||||||
|
>>> f.clean('C1064AA')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
|
||||||
|
>>> f.clean('C106AAB')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
|
||||||
|
>>> f.clean('106AAB')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
|
||||||
|
>>> f.clean('500')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Ensure this value has at least 4 characters (it has 3).']
|
||||||
|
>>> f.clean('5PPP')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean(u'')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# ARDNIField ##################################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.ar.forms import ARDNIField
|
||||||
|
>>> f = ARDNIField()
|
||||||
|
>>> f.clean('20123456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean('20.123.456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean('9123456')
|
||||||
|
u'9123456'
|
||||||
|
>>> f.clean('9.123.456')
|
||||||
|
u'9123456'
|
||||||
|
>>> f.clean(u'20123456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean(u'20.123.456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean('20.123456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean('101234566')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field requires 7 or 8 digits.']
|
||||||
|
>>> f.clean('W0123456')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field requires only numbers.']
|
||||||
|
>>> f.clean('10,123,456')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field requires only numbers.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean(u'')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = ARDNIField(required=False)
|
||||||
|
>>> f.clean('20123456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean('20.123.456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean('9123456')
|
||||||
|
u'9123456'
|
||||||
|
>>> f.clean('9.123.456')
|
||||||
|
u'9123456'
|
||||||
|
>>> f.clean(u'20123456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean(u'20.123.456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean('20.123456')
|
||||||
|
u'20123456'
|
||||||
|
>>> f.clean('101234566')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field requires 7 or 8 digits.']
|
||||||
|
>>> f.clean('W0123456')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field requires only numbers.']
|
||||||
|
>>> f.clean('10,123,456')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field requires only numbers.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean(u'')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# ARCUITField #################################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.ar.forms import ARCUITField
|
||||||
|
>>> f = ARCUITField()
|
||||||
|
>>> f.clean('20-10123456-9')
|
||||||
|
u'20-10123456-9'
|
||||||
|
>>> f.clean(u'20-10123456-9')
|
||||||
|
u'20-10123456-9'
|
||||||
|
>>> f.clean('27-10345678-4')
|
||||||
|
u'27-10345678-4'
|
||||||
|
>>> f.clean('20101234569')
|
||||||
|
u'20-10123456-9'
|
||||||
|
>>> f.clean('27103456784')
|
||||||
|
u'27-10345678-4'
|
||||||
|
>>> f.clean('2-10123456-9')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('210123456-9')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('20-10123456')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('20-10123456-')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('20-10123456-5')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CUIT.']
|
||||||
|
>>> f.clean(u'2-10123456-9')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('27-10345678-1')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CUIT.']
|
||||||
|
>>> f.clean(u'27-10345678-1')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CUIT.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean(u'')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = ARCUITField(required=False)
|
||||||
|
>>> f.clean('20-10123456-9')
|
||||||
|
u'20-10123456-9'
|
||||||
|
>>> f.clean(u'20-10123456-9')
|
||||||
|
u'20-10123456-9'
|
||||||
|
>>> f.clean('27-10345678-4')
|
||||||
|
u'27-10345678-4'
|
||||||
|
>>> f.clean('20101234569')
|
||||||
|
u'20-10123456-9'
|
||||||
|
>>> f.clean('27103456784')
|
||||||
|
u'27-10345678-4'
|
||||||
|
>>> f.clean('2-10123456-9')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('210123456-9')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('20-10123456')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('20-10123456-')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('20-10123456-5')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CUIT.']
|
||||||
|
>>> f.clean(u'2-10123456-9')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
|
||||||
|
>>> f.clean('27-10345678-1')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CUIT.']
|
||||||
|
>>> f.clean(u'27-10345678-1')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CUIT.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean(u'')
|
||||||
|
u''
|
||||||
|
"""
|
|
@ -0,0 +1,134 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ AU form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
## AUPostCodeField ##########################################################
|
||||||
|
|
||||||
|
A field that accepts a four digit Australian post code.
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.au.forms import AUPostCodeField
|
||||||
|
>>> f = AUPostCodeField()
|
||||||
|
>>> f.clean('1234')
|
||||||
|
u'1234'
|
||||||
|
>>> f.clean('2000')
|
||||||
|
u'2000'
|
||||||
|
>>> f.clean('abcd')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a 4 digit post code.']
|
||||||
|
>>> f.clean('20001')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a 4 digit post code.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = AUPostCodeField(required=False)
|
||||||
|
>>> f.clean('1234')
|
||||||
|
u'1234'
|
||||||
|
>>> f.clean('2000')
|
||||||
|
u'2000'
|
||||||
|
>>> f.clean('abcd')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a 4 digit post code.']
|
||||||
|
>>> f.clean('20001')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a 4 digit post code.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
## AUPhoneNumberField ########################################################
|
||||||
|
|
||||||
|
A field that accepts a 10 digit Australian phone number.
|
||||||
|
llows spaces and parentheses around area code.
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.au.forms import AUPhoneNumberField
|
||||||
|
>>> f = AUPhoneNumberField()
|
||||||
|
>>> f.clean('1234567890')
|
||||||
|
u'1234567890'
|
||||||
|
>>> f.clean('0213456789')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('02 13 45 67 89')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('(02) 1345 6789')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('(02) 1345-6789')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('(02)1345-6789')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('0408 123 456')
|
||||||
|
u'0408123456'
|
||||||
|
>>> f.clean('123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must contain 10 digits.']
|
||||||
|
>>> f.clean('1800DJANGO')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must contain 10 digits.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = AUPhoneNumberField(required=False)
|
||||||
|
>>> f.clean('1234567890')
|
||||||
|
u'1234567890'
|
||||||
|
>>> f.clean('0213456789')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('02 13 45 67 89')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('(02) 1345 6789')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('(02) 1345-6789')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('(02)1345-6789')
|
||||||
|
u'0213456789'
|
||||||
|
>>> f.clean('0408 123 456')
|
||||||
|
u'0408123456'
|
||||||
|
>>> f.clean('123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must contain 10 digits.']
|
||||||
|
>>> f.clean('1800DJANGO')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must contain 10 digits.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
## AUStateSelect #############################################################
|
||||||
|
|
||||||
|
AUStateSelect is a Select widget that uses a list of Australian
|
||||||
|
states/territories as its choices.
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.au.forms import AUStateSelect
|
||||||
|
>>> f = AUStateSelect()
|
||||||
|
>>> print f.render('state', 'NSW')
|
||||||
|
<select name="state">
|
||||||
|
<option value="ACT">Australian Capital Territory</option>
|
||||||
|
<option value="NSW" selected="selected">New South Wales</option>
|
||||||
|
<option value="NT">Northern Territory</option>
|
||||||
|
<option value="QLD">Queensland</option>
|
||||||
|
<option value="SA">South Australia</option>
|
||||||
|
<option value="TAS">Tasmania</option>
|
||||||
|
<option value="VIC">Victoria</option>
|
||||||
|
<option value="WA">Western Australia</option>
|
||||||
|
</select>
|
||||||
|
"""
|
|
@ -0,0 +1,220 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ BR form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# BRZipCodeField ############################################################
|
||||||
|
>>> from django.contrib.localflavor.br.forms import BRZipCodeField
|
||||||
|
>>> f = BRZipCodeField()
|
||||||
|
>>> f.clean('12345-123')
|
||||||
|
u'12345-123'
|
||||||
|
>>> f.clean('12345_123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('1234-123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('abcde-abc')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('12345-')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('-123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = BRZipCodeField(required=False)
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean('-123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('12345-')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('abcde-abc')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('1234-123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('12345_123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
|
||||||
|
>>> f.clean('12345-123')
|
||||||
|
u'12345-123'
|
||||||
|
|
||||||
|
# BRCNPJField ############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.br.forms import BRCNPJField
|
||||||
|
>>> f = BRCNPJField(required=True)
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('12-345-678/9012-10')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CNPJ number.']
|
||||||
|
>>> f.clean('12.345.678/9012-10')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CNPJ number.']
|
||||||
|
>>> f.clean('12345678/9012-10')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CNPJ number.']
|
||||||
|
>>> f.clean('64.132.916/0001-88')
|
||||||
|
'64.132.916/0001-88'
|
||||||
|
>>> f.clean('64-132-916/0001-88')
|
||||||
|
'64-132-916/0001-88'
|
||||||
|
>>> f.clean('64132916/0001-88')
|
||||||
|
'64132916/0001-88'
|
||||||
|
>>> f.clean('64.132.916/0001-XX')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field requires only numbers.']
|
||||||
|
>>> f = BRCNPJField(required=False)
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# BRCPFField #################################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.br.forms import BRCPFField
|
||||||
|
>>> f = BRCPFField()
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('489.294.654-54')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CPF number.']
|
||||||
|
>>> f.clean('295.669.575-98')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CPF number.']
|
||||||
|
>>> f.clean('539.315.127-22')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Invalid CPF number.']
|
||||||
|
>>> f.clean('663.256.017-26')
|
||||||
|
u'663.256.017-26'
|
||||||
|
>>> f.clean('66325601726')
|
||||||
|
u'66325601726'
|
||||||
|
>>> f.clean('375.788.573-20')
|
||||||
|
u'375.788.573-20'
|
||||||
|
>>> f.clean('84828509895')
|
||||||
|
u'84828509895'
|
||||||
|
>>> f.clean('375.788.573-XX')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field requires only numbers.']
|
||||||
|
>>> f.clean('375.788.573-000')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Ensure this value has at most 14 characters (it has 15).']
|
||||||
|
>>> f.clean('123.456.78')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Ensure this value has at least 11 characters (it has 10).']
|
||||||
|
>>> f.clean('123456789555')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field requires at most 11 digits or 14 characters.']
|
||||||
|
>>> f = BRCPFField(required=False)
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
|
||||||
|
# BRPhoneNumberField #########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.br.forms import BRPhoneNumberField
|
||||||
|
>>> f = BRPhoneNumberField()
|
||||||
|
>>> f.clean('41-3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('4135623464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41 3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41 3562 3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('(41) 3562 3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41.3562.3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41.3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean(' (41) 3562.3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = BRPhoneNumberField(required=False)
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean(' (41) 3562.3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41.3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('(41) 3562 3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('4135623464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41 3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
|
||||||
|
# BRStateSelect ##############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.br.forms import BRStateSelect
|
||||||
|
>>> w = BRStateSelect()
|
||||||
|
>>> w.render('states', 'PR')
|
||||||
|
u'<select name="states">\n<option value="AC">Acre</option>\n<option value="AL">Alagoas</option>\n<option value="AP">Amap\xe1</option>\n<option value="AM">Amazonas</option>\n<option value="BA">Bahia</option>\n<option value="CE">Cear\xe1</option>\n<option value="DF">Distrito Federal</option>\n<option value="ES">Esp\xedrito Santo</option>\n<option value="GO">Goi\xe1s</option>\n<option value="MA">Maranh\xe3o</option>\n<option value="MT">Mato Grosso</option>\n<option value="MS">Mato Grosso do Sul</option>\n<option value="MG">Minas Gerais</option>\n<option value="PA">Par\xe1</option>\n<option value="PB">Para\xedba</option>\n<option value="PR" selected="selected">Paran\xe1</option>\n<option value="PE">Pernambuco</option>\n<option value="PI">Piau\xed</option>\n<option value="RJ">Rio de Janeiro</option>\n<option value="RN">Rio Grande do Norte</option>\n<option value="RS">Rio Grande do Sul</option>\n<option value="RO">Rond\xf4nia</option>\n<option value="RR">Roraima</option>\n<option value="SC">Santa Catarina</option>\n<option value="SP">S\xe3o Paulo</option>\n<option value="SE">Sergipe</option>\n<option value="TO">Tocantins</option>\n</select>'
|
||||||
|
|
||||||
|
# BRStateChoiceField #########################################################
|
||||||
|
>>> from django.contrib.localflavor.br.forms import BRStateChoiceField
|
||||||
|
>>> f = BRStateChoiceField()
|
||||||
|
>>> ', '.join([f.clean(s) for s, _ in f.widget.choices])
|
||||||
|
u'AC, AL, AP, AM, BA, CE, DF, ES, GO, MA, MT, MS, MG, PA, PB, PR, PE, PI, RJ, RN, RS, RO, RR, SC, SP, SE, TO'
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('pr')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Select a valid brazilian state. That state is not one of the available states.']
|
||||||
|
"""
|
|
@ -0,0 +1,221 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ CA form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# CAPostalCodeField ##############################################################
|
||||||
|
|
||||||
|
CAPostalCodeField validates that the data is a six-character Canadian postal code.
|
||||||
|
>>> from django.contrib.localflavor.ca.forms import CAPostalCodeField
|
||||||
|
>>> f = CAPostalCodeField()
|
||||||
|
>>> f.clean('T2S 2H7')
|
||||||
|
u'T2S 2H7'
|
||||||
|
>>> f.clean('T2S 2H')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXX XXX.']
|
||||||
|
>>> f.clean('2T6 H8I')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXX XXX.']
|
||||||
|
>>> f.clean('T2S2H')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXX XXX.']
|
||||||
|
>>> f.clean(90210)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXX XXX.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f = CAPostalCodeField(required=False)
|
||||||
|
>>> f.clean('T2S 2H7')
|
||||||
|
u'T2S 2H7'
|
||||||
|
>>> f.clean('T2S2H7')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXX XXX.']
|
||||||
|
>>> f.clean('T2S 2H')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXX XXX.']
|
||||||
|
>>> f.clean('2T6 H8I')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXX XXX.']
|
||||||
|
>>> f.clean('T2S2H')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXX XXX.']
|
||||||
|
>>> f.clean(90210)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXX XXX.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# CAPhoneNumberField ##########################################################
|
||||||
|
|
||||||
|
CAPhoneNumberField validates that the data is a valid Canadian phone number,
|
||||||
|
including the area code. It's normalized to XXX-XXX-XXXX format.
|
||||||
|
Note: This test is exactly the same as the USPhoneNumberField except using a real
|
||||||
|
Candian area code
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.ca.forms import CAPhoneNumberField
|
||||||
|
>>> f = CAPhoneNumberField()
|
||||||
|
>>> f.clean('403-555-1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('4035551212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('403 555-1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('(403) 555-1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('403 555 1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('403.555.1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('403.555-1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean(' (403) 555.1212 ')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('555-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean('403-55-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = CAPhoneNumberField(required=False)
|
||||||
|
>>> f.clean('403-555-1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('4035551212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('403 555-1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('(403) 555-1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('403 555 1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('403.555.1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('403.555-1212')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean(' (403) 555.1212 ')
|
||||||
|
u'403-555-1212'
|
||||||
|
>>> f.clean('555-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean('403-55-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# CAProvinceField ################################################################
|
||||||
|
|
||||||
|
CAProvinceField validates that the data is either an abbreviation or name of a
|
||||||
|
Canadian province.
|
||||||
|
>>> from django.contrib.localflavor.ca.forms import CAProvinceField
|
||||||
|
>>> f = CAProvinceField()
|
||||||
|
>>> f.clean('ab')
|
||||||
|
u'AB'
|
||||||
|
>>> f.clean('BC')
|
||||||
|
u'BC'
|
||||||
|
>>> f.clean('nova scotia')
|
||||||
|
u'NS'
|
||||||
|
>>> f.clean(' manitoba ')
|
||||||
|
u'MB'
|
||||||
|
>>> f.clean('T2S 2H7')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a Canadian province or territory.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = CAProvinceField(required=False)
|
||||||
|
>>> f.clean('ab')
|
||||||
|
u'AB'
|
||||||
|
>>> f.clean('BC')
|
||||||
|
u'BC'
|
||||||
|
>>> f.clean('nova scotia')
|
||||||
|
u'NS'
|
||||||
|
>>> f.clean(' manitoba ')
|
||||||
|
u'MB'
|
||||||
|
>>> f.clean('T2S 2H7')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a Canadian province or territory.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# CAProvinceSelect ###############################################################
|
||||||
|
|
||||||
|
CAProvinceSelect is a Select widget that uses a list of Canadian provinces/territories
|
||||||
|
as its choices.
|
||||||
|
>>> from django.contrib.localflavor.ca.forms import CAProvinceSelect
|
||||||
|
>>> w = CAProvinceSelect()
|
||||||
|
>>> print w.render('province', 'AB')
|
||||||
|
<select name="province">
|
||||||
|
<option value="AB" selected="selected">Alberta</option>
|
||||||
|
<option value="BC">British Columbia</option>
|
||||||
|
<option value="MB">Manitoba</option>
|
||||||
|
<option value="NB">New Brunswick</option>
|
||||||
|
<option value="NF">Newfoundland and Labrador</option>
|
||||||
|
<option value="NT">Northwest Territories</option>
|
||||||
|
<option value="NS">Nova Scotia</option>
|
||||||
|
<option value="NU">Nunavut</option>
|
||||||
|
<option value="ON">Ontario</option>
|
||||||
|
<option value="PE">Prince Edward Island</option>
|
||||||
|
<option value="QC">Quebec</option>
|
||||||
|
<option value="SK">Saskatchewan</option>
|
||||||
|
<option value="YK">Yukon</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
# CASocialInsuranceNumberField #################################################
|
||||||
|
>>> from django.contrib.localflavor.ca.forms import CASocialInsuranceNumberField
|
||||||
|
>>> f = CASocialInsuranceNumberField()
|
||||||
|
>>> f.clean('046-454-286')
|
||||||
|
u'046-454-286'
|
||||||
|
>>> f.clean('046-454-287')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid Canadian Social Insurance number in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean('046 454 286')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid Canadian Social Insurance number in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean('046-44-286')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid Canadian Social Insurance number in XXX-XXX-XXXX format.']
|
||||||
|
"""
|
|
@ -0,0 +1,58 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ CH form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# CHZipCodeField ############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.ch.forms import CHZipCodeField
|
||||||
|
>>> f = CHZipCodeField()
|
||||||
|
>>> f.clean('800x')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXX.']
|
||||||
|
>>> f.clean('80 00')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXX.']
|
||||||
|
>>> f.clean('8000')
|
||||||
|
u'8000'
|
||||||
|
|
||||||
|
# CHPhoneNumberField ########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.ch.forms import CHPhoneNumberField
|
||||||
|
>>> f = CHPhoneNumberField()
|
||||||
|
>>> f.clean('01234567890')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in 0XX XXX XX XX format.']
|
||||||
|
>>> f.clean('1234567890')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in 0XX XXX XX XX format.']
|
||||||
|
>>> f.clean('0123456789')
|
||||||
|
u'012 345 67 89'
|
||||||
|
|
||||||
|
# CHIdentityCardNumberField #################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.ch.forms import CHIdentityCardNumberField
|
||||||
|
>>> f = CHIdentityCardNumberField()
|
||||||
|
>>> f.clean('C1234567<0')
|
||||||
|
u'C1234567<0'
|
||||||
|
>>> f.clean('C1234567<1')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.']
|
||||||
|
>>> f.clean('2123456700')
|
||||||
|
u'2123456700'
|
||||||
|
>>> f.clean('2123456701')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.']
|
||||||
|
|
||||||
|
# CHStateSelect #############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.ch.forms import CHStateSelect
|
||||||
|
>>> w = CHStateSelect()
|
||||||
|
>>> w.render('state', 'AG')
|
||||||
|
u'<select name="state">\n<option value="AG" selected="selected">Aargau</option>\n<option value="AI">Appenzell Innerrhoden</option>\n<option value="AR">Appenzell Ausserrhoden</option>\n<option value="BS">Basel-Stadt</option>\n<option value="BL">Basel-Land</option>\n<option value="BE">Berne</option>\n<option value="FR">Fribourg</option>\n<option value="GE">Geneva</option>\n<option value="GL">Glarus</option>\n<option value="GR">Graubuenden</option>\n<option value="JU">Jura</option>\n<option value="LU">Lucerne</option>\n<option value="NE">Neuchatel</option>\n<option value="NW">Nidwalden</option>\n<option value="OW">Obwalden</option>\n<option value="SH">Schaffhausen</option>\n<option value="SZ">Schwyz</option>\n<option value="SO">Solothurn</option>\n<option value="SG">St. Gallen</option>\n<option value="TG">Thurgau</option>\n<option value="TI">Ticino</option>\n<option value="UR">Uri</option>\n<option value="VS">Valais</option>\n<option value="VD">Vaud</option>\n<option value="ZG">Zug</option>\n<option value="ZH">Zurich</option>\n</select>'
|
||||||
|
"""
|
|
@ -0,0 +1,74 @@
|
||||||
|
|
||||||
|
# Tests for the contrib/localflavor/ CL form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
## CLRutField #############################################################
|
||||||
|
|
||||||
|
CLRutField is a Field that checks the validity of the Chilean
|
||||||
|
personal identification number (RUT). It has two modes relaxed (default) and
|
||||||
|
strict.
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.cl.forms import CLRutField
|
||||||
|
>>> rut = CLRutField()
|
||||||
|
|
||||||
|
>>> rut.clean('11-6')
|
||||||
|
u'11-6'
|
||||||
|
>>> rut.clean('116')
|
||||||
|
u'11-6'
|
||||||
|
|
||||||
|
# valid format, bad verifier.
|
||||||
|
>>> rut.clean('11.111.111-0')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'The Chilean RUT is not valid.']
|
||||||
|
>>> rut.clean('111')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'The Chilean RUT is not valid.']
|
||||||
|
|
||||||
|
>>> rut.clean('767484100')
|
||||||
|
u'76.748.410-0'
|
||||||
|
>>> rut.clean('78.412.790-7')
|
||||||
|
u'78.412.790-7'
|
||||||
|
>>> rut.clean('8.334.6043')
|
||||||
|
u'8.334.604-3'
|
||||||
|
>>> rut.clean('76793310-K')
|
||||||
|
u'76.793.310-K'
|
||||||
|
|
||||||
|
Strict RUT usage (does not allow imposible values)
|
||||||
|
>>> rut = CLRutField(strict=True)
|
||||||
|
|
||||||
|
>>> rut.clean('11-6')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.']
|
||||||
|
|
||||||
|
# valid format, bad verifier.
|
||||||
|
>>> rut.clean('11.111.111-0')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'The Chilean RUT is not valid.']
|
||||||
|
|
||||||
|
# Correct input, invalid format.
|
||||||
|
>>> rut.clean('767484100')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.']
|
||||||
|
>>> rut.clean('78.412.790-7')
|
||||||
|
u'78.412.790-7'
|
||||||
|
>>> rut.clean('8.334.6043')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.']
|
||||||
|
>>> rut.clean('76793310-K')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.']
|
||||||
|
|
||||||
|
## CLRegionSelect #########################################################
|
||||||
|
>>> from django.contrib.localflavor.cl.forms import CLRegionSelect
|
||||||
|
>>> f = CLRegionSelect()
|
||||||
|
|
||||||
|
>>> f.render('foo', 'bar')
|
||||||
|
u'<select name="foo">\n<option value="RM">Regi\xf3n Metropolitana de Santiago</option>\n<option value="I">Regi\xf3n de Tarapac\xe1</option>\n<option value="II">Regi\xf3n de Antofagasta</option>\n<option value="III">Regi\xf3n de Atacama</option>\n<option value="IV">Regi\xf3n de Coquimbo</option>\n<option value="V">Regi\xf3n de Valpara\xedso</option>\n<option value="VI">Regi\xf3n del Libertador Bernardo O'Higgins</option>\n<option value="VII">Regi\xf3n del Maule</option>\n<option value="VIII">Regi\xf3n del B\xedo B\xedo</option>\n<option value="IX">Regi\xf3n de la Araucan\xeda</option>\n<option value="X">Regi\xf3n de los Lagos</option>\n<option value="XI">Regi\xf3n de Ays\xe9n del General Carlos Ib\xe1\xf1ez del Campo</option>\n<option value="XII">Regi\xf3n de Magallanes y la Ant\xe1rtica Chilena</option>\n<option value="XIV">Regi\xf3n de Los R\xedos</option>\n<option value="XV">Regi\xf3n de Arica-Parinacota</option>\n</select>'
|
||||||
|
"""
|
|
@ -0,0 +1,35 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ DE form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# DEZipCodeField ##############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.de.forms import DEZipCodeField
|
||||||
|
>>> f = DEZipCodeField()
|
||||||
|
>>> f.clean('99423')
|
||||||
|
u'99423'
|
||||||
|
>>> f.clean(' 99423')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX.']
|
||||||
|
|
||||||
|
# DEStateSelect #############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.de.forms import DEStateSelect
|
||||||
|
>>> w = DEStateSelect()
|
||||||
|
>>> w.render('states', 'TH')
|
||||||
|
u'<select name="states">\n<option value="BW">Baden-Wuerttemberg</option>\n<option value="BY">Bavaria</option>\n<option value="BE">Berlin</option>\n<option value="BB">Brandenburg</option>\n<option value="HB">Bremen</option>\n<option value="HH">Hamburg</option>\n<option value="HE">Hessen</option>\n<option value="MV">Mecklenburg-Western Pomerania</option>\n<option value="NI">Lower Saxony</option>\n<option value="NW">North Rhine-Westphalia</option>\n<option value="RP">Rhineland-Palatinate</option>\n<option value="SL">Saarland</option>\n<option value="SN">Saxony</option>\n<option value="ST">Saxony-Anhalt</option>\n<option value="SH">Schleswig-Holstein</option>\n<option value="TH" selected="selected">Thuringia</option>\n</select>'
|
||||||
|
|
||||||
|
# DEIdentityCardNumberField #################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.de.forms import DEIdentityCardNumberField
|
||||||
|
>>> f = DEIdentityCardNumberField()
|
||||||
|
>>> f.clean('7549313035D-6004103-0903042-0')
|
||||||
|
u'7549313035D-6004103-0903042-0'
|
||||||
|
>>> f.clean('9786324830D 6104243 0910271 2')
|
||||||
|
u'9786324830D-6104243-0910271-2'
|
||||||
|
>>> f.clean('0434657485D-6407276-0508137-9')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format.']
|
||||||
|
"""
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,224 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ FR form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# FRZipCodeField #############################################################
|
||||||
|
|
||||||
|
FRZipCodeField validates that the data is a valid FR zipcode.
|
||||||
|
>>> from django.contrib.localflavor.fr.forms import FRZipCodeField
|
||||||
|
>>> f = FRZipCodeField()
|
||||||
|
>>> f.clean('75001')
|
||||||
|
u'75001'
|
||||||
|
>>> f.clean('93200')
|
||||||
|
u'93200'
|
||||||
|
>>> f.clean('2A200')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX.']
|
||||||
|
>>> f.clean('980001')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = FRZipCodeField(required=False)
|
||||||
|
>>> f.clean('75001')
|
||||||
|
u'75001'
|
||||||
|
>>> f.clean('93200')
|
||||||
|
u'93200'
|
||||||
|
>>> f.clean('2A200')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX.']
|
||||||
|
>>> f.clean('980001')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
|
||||||
|
# FRPhoneNumberField ##########################################################
|
||||||
|
|
||||||
|
FRPhoneNumberField validates that the data is a valid french phone number.
|
||||||
|
It's normalized to 0X XX XX XX XX format. Dots are valid too.
|
||||||
|
>>> from django.contrib.localflavor.fr.forms import FRPhoneNumberField
|
||||||
|
>>> f = FRPhoneNumberField()
|
||||||
|
>>> f.clean('01 55 44 58 64')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('0155445864')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('01 5544 5864')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('01 55.44.58.64')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('01.55.44.58.64')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('01,55,44,58,64')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
|
||||||
|
>>> f.clean('555 015 544')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = FRPhoneNumberField(required=False)
|
||||||
|
>>> f.clean('01 55 44 58 64')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('0155445864')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('01 5544 5864')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('01 55.44.58.64')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('01.55.44.58.64')
|
||||||
|
u'01 55 44 58 64'
|
||||||
|
>>> f.clean('01,55,44,58,64')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
|
||||||
|
>>> f.clean('555 015 544')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# FRDepartmentSelect ###############################################################
|
||||||
|
|
||||||
|
FRDepartmentSelect is a Select widget that uses a list of french departments
|
||||||
|
including DOM TOM
|
||||||
|
>>> from django.contrib.localflavor.fr.forms import FRDepartmentSelect
|
||||||
|
>>> w = FRDepartmentSelect()
|
||||||
|
>>> print w.render('dep', 'Paris')
|
||||||
|
<select name="dep">
|
||||||
|
<option value="01">01 - Ain</option>
|
||||||
|
<option value="02">02 - Aisne</option>
|
||||||
|
<option value="03">03 - Allier</option>
|
||||||
|
<option value="04">04 - Alpes-de-Haute-Provence</option>
|
||||||
|
<option value="05">05 - Hautes-Alpes</option>
|
||||||
|
<option value="06">06 - Alpes-Maritimes</option>
|
||||||
|
<option value="07">07 - Ardeche</option>
|
||||||
|
<option value="08">08 - Ardennes</option>
|
||||||
|
<option value="09">09 - Ariege</option>
|
||||||
|
<option value="10">10 - Aube</option>
|
||||||
|
<option value="11">11 - Aude</option>
|
||||||
|
<option value="12">12 - Aveyron</option>
|
||||||
|
<option value="13">13 - Bouches-du-Rhone</option>
|
||||||
|
<option value="14">14 - Calvados</option>
|
||||||
|
<option value="15">15 - Cantal</option>
|
||||||
|
<option value="16">16 - Charente</option>
|
||||||
|
<option value="17">17 - Charente-Maritime</option>
|
||||||
|
<option value="18">18 - Cher</option>
|
||||||
|
<option value="19">19 - Correze</option>
|
||||||
|
<option value="21">21 - Cote-d'Or</option>
|
||||||
|
<option value="22">22 - Cotes-d'Armor</option>
|
||||||
|
<option value="23">23 - Creuse</option>
|
||||||
|
<option value="24">24 - Dordogne</option>
|
||||||
|
<option value="25">25 - Doubs</option>
|
||||||
|
<option value="26">26 - Drome</option>
|
||||||
|
<option value="27">27 - Eure</option>
|
||||||
|
<option value="28">28 - Eure-et-Loire</option>
|
||||||
|
<option value="29">29 - Finistere</option>
|
||||||
|
<option value="2A">2A - Corse-du-Sud</option>
|
||||||
|
<option value="2B">2B - Haute-Corse</option>
|
||||||
|
<option value="30">30 - Gard</option>
|
||||||
|
<option value="31">31 - Haute-Garonne</option>
|
||||||
|
<option value="32">32 - Gers</option>
|
||||||
|
<option value="33">33 - Gironde</option>
|
||||||
|
<option value="34">34 - Herault</option>
|
||||||
|
<option value="35">35 - Ille-et-Vilaine</option>
|
||||||
|
<option value="36">36 - Indre</option>
|
||||||
|
<option value="37">37 - Indre-et-Loire</option>
|
||||||
|
<option value="38">38 - Isere</option>
|
||||||
|
<option value="39">39 - Jura</option>
|
||||||
|
<option value="40">40 - Landes</option>
|
||||||
|
<option value="41">41 - Loir-et-Cher</option>
|
||||||
|
<option value="42">42 - Loire</option>
|
||||||
|
<option value="43">43 - Haute-Loire</option>
|
||||||
|
<option value="44">44 - Loire-Atlantique</option>
|
||||||
|
<option value="45">45 - Loiret</option>
|
||||||
|
<option value="46">46 - Lot</option>
|
||||||
|
<option value="47">47 - Lot-et-Garonne</option>
|
||||||
|
<option value="48">48 - Lozere</option>
|
||||||
|
<option value="49">49 - Maine-et-Loire</option>
|
||||||
|
<option value="50">50 - Manche</option>
|
||||||
|
<option value="51">51 - Marne</option>
|
||||||
|
<option value="52">52 - Haute-Marne</option>
|
||||||
|
<option value="53">53 - Mayenne</option>
|
||||||
|
<option value="54">54 - Meurthe-et-Moselle</option>
|
||||||
|
<option value="55">55 - Meuse</option>
|
||||||
|
<option value="56">56 - Morbihan</option>
|
||||||
|
<option value="57">57 - Moselle</option>
|
||||||
|
<option value="58">58 - Nievre</option>
|
||||||
|
<option value="59">59 - Nord</option>
|
||||||
|
<option value="60">60 - Oise</option>
|
||||||
|
<option value="61">61 - Orne</option>
|
||||||
|
<option value="62">62 - Pas-de-Calais</option>
|
||||||
|
<option value="63">63 - Puy-de-Dome</option>
|
||||||
|
<option value="64">64 - Pyrenees-Atlantiques</option>
|
||||||
|
<option value="65">65 - Hautes-Pyrenees</option>
|
||||||
|
<option value="66">66 - Pyrenees-Orientales</option>
|
||||||
|
<option value="67">67 - Bas-Rhin</option>
|
||||||
|
<option value="68">68 - Haut-Rhin</option>
|
||||||
|
<option value="69">69 - Rhone</option>
|
||||||
|
<option value="70">70 - Haute-Saone</option>
|
||||||
|
<option value="71">71 - Saone-et-Loire</option>
|
||||||
|
<option value="72">72 - Sarthe</option>
|
||||||
|
<option value="73">73 - Savoie</option>
|
||||||
|
<option value="74">74 - Haute-Savoie</option>
|
||||||
|
<option value="75">75 - Paris</option>
|
||||||
|
<option value="76">76 - Seine-Maritime</option>
|
||||||
|
<option value="77">77 - Seine-et-Marne</option>
|
||||||
|
<option value="78">78 - Yvelines</option>
|
||||||
|
<option value="79">79 - Deux-Sevres</option>
|
||||||
|
<option value="80">80 - Somme</option>
|
||||||
|
<option value="81">81 - Tarn</option>
|
||||||
|
<option value="82">82 - Tarn-et-Garonne</option>
|
||||||
|
<option value="83">83 - Var</option>
|
||||||
|
<option value="84">84 - Vaucluse</option>
|
||||||
|
<option value="85">85 - Vendee</option>
|
||||||
|
<option value="86">86 - Vienne</option>
|
||||||
|
<option value="87">87 - Haute-Vienne</option>
|
||||||
|
<option value="88">88 - Vosges</option>
|
||||||
|
<option value="89">89 - Yonne</option>
|
||||||
|
<option value="90">90 - Territoire de Belfort</option>
|
||||||
|
<option value="91">91 - Essonne</option>
|
||||||
|
<option value="92">92 - Hauts-de-Seine</option>
|
||||||
|
<option value="93">93 - Seine-Saint-Denis</option>
|
||||||
|
<option value="94">94 - Val-de-Marne</option>
|
||||||
|
<option value="95">95 - Val-d'Oise</option>
|
||||||
|
<option value="2A">2A - Corse du sud</option>
|
||||||
|
<option value="2B">2B - Haute Corse</option>
|
||||||
|
<option value="971">971 - Guadeloupe</option>
|
||||||
|
<option value="972">972 - Martinique</option>
|
||||||
|
<option value="973">973 - Guyane</option>
|
||||||
|
<option value="974">974 - La Reunion</option>
|
||||||
|
<option value="975">975 - Saint-Pierre-et-Miquelon</option>
|
||||||
|
<option value="976">976 - Mayotte</option>
|
||||||
|
<option value="984">984 - Terres Australes et Antarctiques</option>
|
||||||
|
<option value="986">986 - Wallis et Futuna</option>
|
||||||
|
<option value="987">987 - Polynesie Francaise</option>
|
||||||
|
<option value="988">988 - Nouvelle-Caledonie</option>
|
||||||
|
</select>
|
||||||
|
"""
|
|
@ -0,0 +1,163 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ generic form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
## Generic DateField ##########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.generic.forms import *
|
||||||
|
|
||||||
|
A DateField that uses generic dd/mm/yy dates instead of mm/dd/yy where
|
||||||
|
appropriate.
|
||||||
|
|
||||||
|
>>> import datetime
|
||||||
|
>>> f = DateField()
|
||||||
|
>>> f.clean(datetime.date(2006, 10, 25))
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30))
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59))
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59, 200))
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('2006-10-25')
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('25/10/2006')
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('25/10/06')
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('Oct 25 2006')
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('October 25 2006')
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('October 25, 2006')
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('25 October 2006')
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('25 October, 2006')
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('2006-4-31')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid date.']
|
||||||
|
>>> f.clean('200a-10-25')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid date.']
|
||||||
|
>>> f.clean('10/25/06')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid date.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = DateField(required=False)
|
||||||
|
>>> f.clean(None)
|
||||||
|
>>> repr(f.clean(None))
|
||||||
|
'None'
|
||||||
|
>>> f.clean('')
|
||||||
|
>>> repr(f.clean(''))
|
||||||
|
'None'
|
||||||
|
|
||||||
|
DateField accepts an optional input_formats parameter:
|
||||||
|
>>> f = DateField(input_formats=['%Y %m %d'])
|
||||||
|
>>> f.clean(datetime.date(2006, 10, 25))
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30))
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
>>> f.clean('2006 10 25')
|
||||||
|
datetime.date(2006, 10, 25)
|
||||||
|
|
||||||
|
The input_formats parameter overrides all default input formats,
|
||||||
|
so the default formats won't work unless you specify them:
|
||||||
|
>>> f.clean('2006-10-25')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid date.']
|
||||||
|
>>> f.clean('25/10/2006')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid date.']
|
||||||
|
>>> f.clean('25/10/06')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid date.']
|
||||||
|
|
||||||
|
## Generic DateTimeField ######################################################
|
||||||
|
|
||||||
|
A DateField that uses generic dd/mm/yy dates instead of mm/dd/yy where
|
||||||
|
appropriate.
|
||||||
|
|
||||||
|
>>> import datetime
|
||||||
|
>>> f = DateTimeField()
|
||||||
|
>>> f.clean(datetime.date(2006, 10, 25))
|
||||||
|
datetime.datetime(2006, 10, 25, 0, 0)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30))
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59))
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30, 59)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59, 200))
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30, 59, 200)
|
||||||
|
>>> f.clean('2006-10-25 14:30:45')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30, 45)
|
||||||
|
>>> f.clean('2006-10-25 14:30:00')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30)
|
||||||
|
>>> f.clean('2006-10-25 14:30')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30)
|
||||||
|
>>> f.clean('2006-10-25')
|
||||||
|
datetime.datetime(2006, 10, 25, 0, 0)
|
||||||
|
>>> f.clean('25/10/2006 14:30:45')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30, 45)
|
||||||
|
>>> f.clean('25/10/2006 14:30:00')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30)
|
||||||
|
>>> f.clean('25/10/2006 14:30')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30)
|
||||||
|
>>> f.clean('25/10/2006')
|
||||||
|
datetime.datetime(2006, 10, 25, 0, 0)
|
||||||
|
>>> f.clean('25/10/06 14:30:45')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30, 45)
|
||||||
|
>>> f.clean('25/10/06 14:30:00')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30)
|
||||||
|
>>> f.clean('25/10/06 14:30')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30)
|
||||||
|
>>> f.clean('25/10/06')
|
||||||
|
datetime.datetime(2006, 10, 25, 0, 0)
|
||||||
|
>>> f.clean('hello')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid date/time.']
|
||||||
|
>>> f.clean('2006-10-25 4:30 p.m.')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid date/time.']
|
||||||
|
|
||||||
|
DateField accepts an optional input_formats parameter:
|
||||||
|
>>> f = DateTimeField(input_formats=['%Y %m %d %I:%M %p'])
|
||||||
|
>>> f.clean(datetime.date(2006, 10, 25))
|
||||||
|
datetime.datetime(2006, 10, 25, 0, 0)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30))
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59))
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30, 59)
|
||||||
|
>>> f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59, 200))
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30, 59, 200)
|
||||||
|
>>> f.clean('2006 10 25 2:30 PM')
|
||||||
|
datetime.datetime(2006, 10, 25, 14, 30)
|
||||||
|
|
||||||
|
The input_formats parameter overrides all default input formats,
|
||||||
|
so the default formats won't work unless you specify them:
|
||||||
|
>>> f.clean('2006-10-25 14:30:45')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid date/time.']
|
||||||
|
|
||||||
|
>>> f = DateTimeField(required=False)
|
||||||
|
>>> f.clean(None)
|
||||||
|
>>> repr(f.clean(None))
|
||||||
|
'None'
|
||||||
|
>>> f.clean('')
|
||||||
|
>>> repr(f.clean(''))
|
||||||
|
'None'
|
||||||
|
|
||||||
|
"""
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,62 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ IT form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# ITZipCodeField #############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.it.forms import ITZipCodeField
|
||||||
|
>>> f = ITZipCodeField()
|
||||||
|
>>> f.clean('00100')
|
||||||
|
u'00100'
|
||||||
|
>>> f.clean(' 00100')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid zip code.']
|
||||||
|
|
||||||
|
# ITRegionSelect #############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.it.forms import ITRegionSelect
|
||||||
|
>>> w = ITRegionSelect()
|
||||||
|
>>> w.render('regions', 'PMN')
|
||||||
|
u'<select name="regions">\n<option value="ABR">Abruzzo</option>\n<option value="BAS">Basilicata</option>\n<option value="CAL">Calabria</option>\n<option value="CAM">Campania</option>\n<option value="EMR">Emilia-Romagna</option>\n<option value="FVG">Friuli-Venezia Giulia</option>\n<option value="LAZ">Lazio</option>\n<option value="LIG">Liguria</option>\n<option value="LOM">Lombardia</option>\n<option value="MAR">Marche</option>\n<option value="MOL">Molise</option>\n<option value="PMN" selected="selected">Piemonte</option>\n<option value="PUG">Puglia</option>\n<option value="SAR">Sardegna</option>\n<option value="SIC">Sicilia</option>\n<option value="TOS">Toscana</option>\n<option value="TAA">Trentino-Alto Adige</option>\n<option value="UMB">Umbria</option>\n<option value="VAO">Valle d\u2019Aosta</option>\n<option value="VEN">Veneto</option>\n</select>'
|
||||||
|
|
||||||
|
# ITSocialSecurityNumberField #################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.it.forms import ITSocialSecurityNumberField
|
||||||
|
>>> f = ITSocialSecurityNumberField()
|
||||||
|
>>> f.clean('LVSGDU99T71H501L')
|
||||||
|
u'LVSGDU99T71H501L'
|
||||||
|
>>> f.clean('LBRRME11A01L736W')
|
||||||
|
u'LBRRME11A01L736W'
|
||||||
|
>>> f.clean('lbrrme11a01l736w')
|
||||||
|
u'LBRRME11A01L736W'
|
||||||
|
>>> f.clean('LBR RME 11A01 L736W')
|
||||||
|
u'LBRRME11A01L736W'
|
||||||
|
>>> f.clean('LBRRME11A01L736A')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid Social Security number.']
|
||||||
|
>>> f.clean('%BRRME11A01L736W')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid Social Security number.']
|
||||||
|
|
||||||
|
# ITVatNumberField ###########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.it.forms import ITVatNumberField
|
||||||
|
>>> f = ITVatNumberField()
|
||||||
|
>>> f.clean('07973780013')
|
||||||
|
u'07973780013'
|
||||||
|
>>> f.clean('7973780013')
|
||||||
|
u'07973780013'
|
||||||
|
>>> f.clean(7973780013)
|
||||||
|
u'07973780013'
|
||||||
|
>>> f.clean('07973780014')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid VAT number.']
|
||||||
|
>>> f.clean('A7973780013')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid VAT number.']
|
||||||
|
"""
|
|
@ -0,0 +1,106 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ JP form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# JPPostalCodeField ###############################################################
|
||||||
|
|
||||||
|
A form field that validates its input is a Japanese postcode.
|
||||||
|
|
||||||
|
Accepts 7 digits(with/out hyphen).
|
||||||
|
>>> from django.contrib.localflavor.jp.forms import JPPostalCodeField
|
||||||
|
>>> f = JPPostalCodeField()
|
||||||
|
>>> f.clean('251-0032')
|
||||||
|
u'2510032'
|
||||||
|
>>> f.clean('2510032')
|
||||||
|
u'2510032'
|
||||||
|
>>> f.clean('2510-032')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
|
||||||
|
>>> f.clean('251a0032')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
|
||||||
|
>>> f.clean('a51-0032')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
|
||||||
|
>>> f.clean('25100321')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = JPPostalCodeField(required=False)
|
||||||
|
>>> f.clean('251-0032')
|
||||||
|
u'2510032'
|
||||||
|
>>> f.clean('2510032')
|
||||||
|
u'2510032'
|
||||||
|
>>> f.clean('2510-032')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
|
||||||
|
# JPPrefectureSelect ###############################################################
|
||||||
|
|
||||||
|
A Select widget that uses a list of Japanese prefectures as its choices.
|
||||||
|
>>> from django.contrib.localflavor.jp.forms import JPPrefectureSelect
|
||||||
|
>>> w = JPPrefectureSelect()
|
||||||
|
>>> print w.render('prefecture', 'kanagawa')
|
||||||
|
<select name="prefecture">
|
||||||
|
<option value="hokkaido">Hokkaido</option>
|
||||||
|
<option value="aomori">Aomori</option>
|
||||||
|
<option value="iwate">Iwate</option>
|
||||||
|
<option value="miyagi">Miyagi</option>
|
||||||
|
<option value="akita">Akita</option>
|
||||||
|
<option value="yamagata">Yamagata</option>
|
||||||
|
<option value="fukushima">Fukushima</option>
|
||||||
|
<option value="ibaraki">Ibaraki</option>
|
||||||
|
<option value="tochigi">Tochigi</option>
|
||||||
|
<option value="gunma">Gunma</option>
|
||||||
|
<option value="saitama">Saitama</option>
|
||||||
|
<option value="chiba">Chiba</option>
|
||||||
|
<option value="tokyo">Tokyo</option>
|
||||||
|
<option value="kanagawa" selected="selected">Kanagawa</option>
|
||||||
|
<option value="yamanashi">Yamanashi</option>
|
||||||
|
<option value="nagano">Nagano</option>
|
||||||
|
<option value="niigata">Niigata</option>
|
||||||
|
<option value="toyama">Toyama</option>
|
||||||
|
<option value="ishikawa">Ishikawa</option>
|
||||||
|
<option value="fukui">Fukui</option>
|
||||||
|
<option value="gifu">Gifu</option>
|
||||||
|
<option value="shizuoka">Shizuoka</option>
|
||||||
|
<option value="aichi">Aichi</option>
|
||||||
|
<option value="mie">Mie</option>
|
||||||
|
<option value="shiga">Shiga</option>
|
||||||
|
<option value="kyoto">Kyoto</option>
|
||||||
|
<option value="osaka">Osaka</option>
|
||||||
|
<option value="hyogo">Hyogo</option>
|
||||||
|
<option value="nara">Nara</option>
|
||||||
|
<option value="wakayama">Wakayama</option>
|
||||||
|
<option value="tottori">Tottori</option>
|
||||||
|
<option value="shimane">Shimane</option>
|
||||||
|
<option value="okayama">Okayama</option>
|
||||||
|
<option value="hiroshima">Hiroshima</option>
|
||||||
|
<option value="yamaguchi">Yamaguchi</option>
|
||||||
|
<option value="tokushima">Tokushima</option>
|
||||||
|
<option value="kagawa">Kagawa</option>
|
||||||
|
<option value="ehime">Ehime</option>
|
||||||
|
<option value="kochi">Kochi</option>
|
||||||
|
<option value="fukuoka">Fukuoka</option>
|
||||||
|
<option value="saga">Saga</option>
|
||||||
|
<option value="nagasaki">Nagasaki</option>
|
||||||
|
<option value="kumamoto">Kumamoto</option>
|
||||||
|
<option value="oita">Oita</option>
|
||||||
|
<option value="miyazaki">Miyazaki</option>
|
||||||
|
<option value="kagoshima">Kagoshima</option>
|
||||||
|
<option value="okinawa">Okinawa</option>
|
||||||
|
</select>
|
||||||
|
"""
|
|
@ -0,0 +1,72 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ NL form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# NLPhoneNumberField ########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.nl.forms import NLPhoneNumberField
|
||||||
|
>>> f = NLPhoneNumberField(required=False)
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean('012-3456789')
|
||||||
|
'012-3456789'
|
||||||
|
>>> f.clean('0123456789')
|
||||||
|
'0123456789'
|
||||||
|
>>> f.clean('+31-12-3456789')
|
||||||
|
'+31-12-3456789'
|
||||||
|
>>> f.clean('(0123) 456789')
|
||||||
|
'(0123) 456789'
|
||||||
|
>>> f.clean('foo')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid phone number']
|
||||||
|
|
||||||
|
# NLZipCodeField ############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.nl.forms import NLZipCodeField
|
||||||
|
>>> f = NLZipCodeField(required=False)
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean('1234ab')
|
||||||
|
u'1234 AB'
|
||||||
|
>>> f.clean('1234 ab')
|
||||||
|
u'1234 AB'
|
||||||
|
>>> f.clean('1234 AB')
|
||||||
|
u'1234 AB'
|
||||||
|
>>> f.clean('0123AB')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid postal code']
|
||||||
|
>>> f.clean('foo')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid postal code']
|
||||||
|
|
||||||
|
# NLSoFiNumberField #########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.nl.forms import NLSoFiNumberField
|
||||||
|
>>> f = NLSoFiNumberField(required=False)
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean('123456782')
|
||||||
|
'123456782'
|
||||||
|
>>> f.clean('000000000')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid SoFi number']
|
||||||
|
>>> f.clean('123456789')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid SoFi number']
|
||||||
|
>>> f.clean('foo')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid SoFi number']
|
||||||
|
|
||||||
|
# NLProvinceSelect ##########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.nl.forms import NLProvinceSelect
|
||||||
|
>>> s = NLProvinceSelect()
|
||||||
|
>>> s.render('provinces', 'OV')
|
||||||
|
u'<select name="provinces">\n<option value="DR">Drente</option>\n<option value="FL">Flevoland</option>\n<option value="FR">Friesland</option>\n<option value="GL">Gelderland</option>\n<option value="GR">Groningen</option>\n<option value="LB">Limburg</option>\n<option value="NB">Noord-Brabant</option>\n<option value="NH">Noord-Holland</option>\n<option value="OV" selected="selected">Overijssel</option>\n<option value="UT">Utrecht</option>\n<option value="ZE">Zeeland</option>\n<option value="ZH">Zuid-Holland</option>\n</select>'
|
||||||
|
"""
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,31 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ SK form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# SKPostalCodeField #########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.sk.forms import SKPostalCodeField
|
||||||
|
>>> f = SKPostalCodeField()
|
||||||
|
>>> f.clean('84545x')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postal code in the format XXXXX or XXX XX.']
|
||||||
|
>>> f.clean('91909')
|
||||||
|
u'91909'
|
||||||
|
>>> f.clean('917 01')
|
||||||
|
u'91701'
|
||||||
|
|
||||||
|
# SKRegionSelect ############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.sk.forms import SKRegionSelect
|
||||||
|
>>> w = SKRegionSelect()
|
||||||
|
>>> w.render('regions', 'TT')
|
||||||
|
u'<select name="regions">\n<option value="BB">Banska Bystrica region</option>\n<option value="BA">Bratislava region</option>\n<option value="KE">Kosice region</option>\n<option value="NR">Nitra region</option>\n<option value="PO">Presov region</option>\n<option value="TN">Trencin region</option>\n<option value="TT" selected="selected">Trnava region</option>\n<option value="ZA">Zilina region</option>\n</select>'
|
||||||
|
|
||||||
|
# SKDistrictSelect ##########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.sk.forms import SKDistrictSelect
|
||||||
|
>>> w = SKDistrictSelect()
|
||||||
|
>>> w.render('Districts', 'RK')
|
||||||
|
u'<select name="Districts">\n<option value="BB">Banska Bystrica</option>\n<option value="BS">Banska Stiavnica</option>\n<option value="BJ">Bardejov</option>\n<option value="BN">Banovce nad Bebravou</option>\n<option value="BR">Brezno</option>\n<option value="BA1">Bratislava I</option>\n<option value="BA2">Bratislava II</option>\n<option value="BA3">Bratislava III</option>\n<option value="BA4">Bratislava IV</option>\n<option value="BA5">Bratislava V</option>\n<option value="BY">Bytca</option>\n<option value="CA">Cadca</option>\n<option value="DT">Detva</option>\n<option value="DK">Dolny Kubin</option>\n<option value="DS">Dunajska Streda</option>\n<option value="GA">Galanta</option>\n<option value="GL">Gelnica</option>\n<option value="HC">Hlohovec</option>\n<option value="HE">Humenne</option>\n<option value="IL">Ilava</option>\n<option value="KK">Kezmarok</option>\n<option value="KN">Komarno</option>\n<option value="KE1">Kosice I</option>\n<option value="KE2">Kosice II</option>\n<option value="KE3">Kosice III</option>\n<option value="KE4">Kosice IV</option>\n<option value="KEO">Kosice - okolie</option>\n<option value="KA">Krupina</option>\n<option value="KM">Kysucke Nove Mesto</option>\n<option value="LV">Levice</option>\n<option value="LE">Levoca</option>\n<option value="LM">Liptovsky Mikulas</option>\n<option value="LC">Lucenec</option>\n<option value="MA">Malacky</option>\n<option value="MT">Martin</option>\n<option value="ML">Medzilaborce</option>\n<option value="MI">Michalovce</option>\n<option value="MY">Myjava</option>\n<option value="NO">Namestovo</option>\n<option value="NR">Nitra</option>\n<option value="NM">Nove Mesto nad Vahom</option>\n<option value="NZ">Nove Zamky</option>\n<option value="PE">Partizanske</option>\n<option value="PK">Pezinok</option>\n<option value="PN">Piestany</option>\n<option value="PT">Poltar</option>\n<option value="PP">Poprad</option>\n<option value="PB">Povazska Bystrica</option>\n<option value="PO">Presov</option>\n<option value="PD">Prievidza</option>\n<option value="PU">Puchov</option>\n<option value="RA">Revuca</option>\n<option value="RS">Rimavska Sobota</option>\n<option value="RV">Roznava</option>\n<option value="RK" selected="selected">Ruzomberok</option>\n<option value="SB">Sabinov</option>\n<option value="SC">Senec</option>\n<option value="SE">Senica</option>\n<option value="SI">Skalica</option>\n<option value="SV">Snina</option>\n<option value="SO">Sobrance</option>\n<option value="SN">Spisska Nova Ves</option>\n<option value="SL">Stara Lubovna</option>\n<option value="SP">Stropkov</option>\n<option value="SK">Svidnik</option>\n<option value="SA">Sala</option>\n<option value="TO">Topolcany</option>\n<option value="TV">Trebisov</option>\n<option value="TN">Trencin</option>\n<option value="TT">Trnava</option>\n<option value="TR">Turcianske Teplice</option>\n<option value="TS">Tvrdosin</option>\n<option value="VK">Velky Krtis</option>\n<option value="VT">Vranov nad Toplou</option>\n<option value="ZM">Zlate Moravce</option>\n<option value="ZV">Zvolen</option>\n<option value="ZC">Zarnovica</option>\n<option value="ZH">Ziar nad Hronom</option>\n<option value="ZA">Zilina</option>\n</select>'
|
||||||
|
"""
|
|
@ -0,0 +1,48 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ UK form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# UKPostcodeField #############################################################
|
||||||
|
|
||||||
|
UKPostcodeField validates that the data is a valid UK postcode.
|
||||||
|
>>> from django.contrib.localflavor.uk.forms import UKPostcodeField
|
||||||
|
>>> f = UKPostcodeField()
|
||||||
|
>>> f.clean('BT32 4PX')
|
||||||
|
u'BT32 4PX'
|
||||||
|
>>> f.clean('GIR 0AA')
|
||||||
|
u'GIR 0AA'
|
||||||
|
>>> f.clean('BT324PX')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
|
||||||
|
>>> f.clean('1NV 4L1D')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = UKPostcodeField(required=False)
|
||||||
|
>>> f.clean('BT32 4PX')
|
||||||
|
u'BT32 4PX'
|
||||||
|
>>> f.clean('GIR 0AA')
|
||||||
|
u'GIR 0AA'
|
||||||
|
>>> f.clean('1NV 4L1D')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
|
||||||
|
>>> f.clean('BT324PX')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
"""
|
|
@ -0,0 +1,260 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ US form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# USZipCodeField ##############################################################
|
||||||
|
|
||||||
|
USZipCodeField validates that the data is either a five-digit U.S. zip code or
|
||||||
|
a zip+4.
|
||||||
|
>>> from django.contrib.localflavor.us.forms import USZipCodeField
|
||||||
|
>>> f = USZipCodeField()
|
||||||
|
>>> f.clean('60606')
|
||||||
|
u'60606'
|
||||||
|
>>> f.clean(60606)
|
||||||
|
u'60606'
|
||||||
|
>>> f.clean('04000')
|
||||||
|
u'04000'
|
||||||
|
>>> f.clean('4000')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
|
||||||
|
>>> f.clean('60606-1234')
|
||||||
|
u'60606-1234'
|
||||||
|
>>> f.clean('6060-1234')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
|
||||||
|
>>> f.clean('60606-')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = USZipCodeField(required=False)
|
||||||
|
>>> f.clean('60606')
|
||||||
|
u'60606'
|
||||||
|
>>> f.clean(60606)
|
||||||
|
u'60606'
|
||||||
|
>>> f.clean('04000')
|
||||||
|
u'04000'
|
||||||
|
>>> f.clean('4000')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
|
||||||
|
>>> f.clean('60606-1234')
|
||||||
|
u'60606-1234'
|
||||||
|
>>> f.clean('6060-1234')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
|
||||||
|
>>> f.clean('60606-')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# USPhoneNumberField ##########################################################
|
||||||
|
|
||||||
|
USPhoneNumberField validates that the data is a valid U.S. phone number,
|
||||||
|
including the area code. It's normalized to XXX-XXX-XXXX format.
|
||||||
|
>>> from django.contrib.localflavor.us.forms import USPhoneNumberField
|
||||||
|
>>> f = USPhoneNumberField()
|
||||||
|
>>> f.clean('312-555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('3125551212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312 555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('(312) 555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312 555 1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312.555.1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312.555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean(' (312) 555.1212 ')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('555-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean('312-55-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = USPhoneNumberField(required=False)
|
||||||
|
>>> f.clean('312-555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('3125551212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312 555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('(312) 555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312 555 1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312.555.1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312.555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean(' (312) 555.1212 ')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('555-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean('312-55-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# USStateField ################################################################
|
||||||
|
|
||||||
|
USStateField validates that the data is either an abbreviation or name of a
|
||||||
|
U.S. state.
|
||||||
|
>>> from django.contrib.localflavor.us.forms import USStateField
|
||||||
|
>>> f = USStateField()
|
||||||
|
>>> f.clean('il')
|
||||||
|
u'IL'
|
||||||
|
>>> f.clean('IL')
|
||||||
|
u'IL'
|
||||||
|
>>> f.clean('illinois')
|
||||||
|
u'IL'
|
||||||
|
>>> f.clean(' illinois ')
|
||||||
|
u'IL'
|
||||||
|
>>> f.clean(60606)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a U.S. state or territory.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = USStateField(required=False)
|
||||||
|
>>> f.clean('il')
|
||||||
|
u'IL'
|
||||||
|
>>> f.clean('IL')
|
||||||
|
u'IL'
|
||||||
|
>>> f.clean('illinois')
|
||||||
|
u'IL'
|
||||||
|
>>> f.clean(' illinois ')
|
||||||
|
u'IL'
|
||||||
|
>>> f.clean(60606)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a U.S. state or territory.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
|
# USStateSelect ###############################################################
|
||||||
|
|
||||||
|
USStateSelect is a Select widget that uses a list of U.S. states/territories
|
||||||
|
as its choices.
|
||||||
|
>>> from django.contrib.localflavor.us.forms import USStateSelect
|
||||||
|
>>> w = USStateSelect()
|
||||||
|
>>> print w.render('state', 'IL')
|
||||||
|
<select name="state">
|
||||||
|
<option value="AL">Alabama</option>
|
||||||
|
<option value="AK">Alaska</option>
|
||||||
|
<option value="AS">American Samoa</option>
|
||||||
|
<option value="AZ">Arizona</option>
|
||||||
|
<option value="AR">Arkansas</option>
|
||||||
|
<option value="CA">California</option>
|
||||||
|
<option value="CO">Colorado</option>
|
||||||
|
<option value="CT">Connecticut</option>
|
||||||
|
<option value="DE">Delaware</option>
|
||||||
|
<option value="DC">District of Columbia</option>
|
||||||
|
<option value="FM">Federated States of Micronesia</option>
|
||||||
|
<option value="FL">Florida</option>
|
||||||
|
<option value="GA">Georgia</option>
|
||||||
|
<option value="GU">Guam</option>
|
||||||
|
<option value="HI">Hawaii</option>
|
||||||
|
<option value="ID">Idaho</option>
|
||||||
|
<option value="IL" selected="selected">Illinois</option>
|
||||||
|
<option value="IN">Indiana</option>
|
||||||
|
<option value="IA">Iowa</option>
|
||||||
|
<option value="KS">Kansas</option>
|
||||||
|
<option value="KY">Kentucky</option>
|
||||||
|
<option value="LA">Louisiana</option>
|
||||||
|
<option value="ME">Maine</option>
|
||||||
|
<option value="MH">Marshall Islands</option>
|
||||||
|
<option value="MD">Maryland</option>
|
||||||
|
<option value="MA">Massachusetts</option>
|
||||||
|
<option value="MI">Michigan</option>
|
||||||
|
<option value="MN">Minnesota</option>
|
||||||
|
<option value="MS">Mississippi</option>
|
||||||
|
<option value="MO">Missouri</option>
|
||||||
|
<option value="MT">Montana</option>
|
||||||
|
<option value="NE">Nebraska</option>
|
||||||
|
<option value="NV">Nevada</option>
|
||||||
|
<option value="NH">New Hampshire</option>
|
||||||
|
<option value="NJ">New Jersey</option>
|
||||||
|
<option value="NM">New Mexico</option>
|
||||||
|
<option value="NY">New York</option>
|
||||||
|
<option value="NC">North Carolina</option>
|
||||||
|
<option value="ND">North Dakota</option>
|
||||||
|
<option value="MP">Northern Mariana Islands</option>
|
||||||
|
<option value="OH">Ohio</option>
|
||||||
|
<option value="OK">Oklahoma</option>
|
||||||
|
<option value="OR">Oregon</option>
|
||||||
|
<option value="PW">Palau</option>
|
||||||
|
<option value="PA">Pennsylvania</option>
|
||||||
|
<option value="PR">Puerto Rico</option>
|
||||||
|
<option value="RI">Rhode Island</option>
|
||||||
|
<option value="SC">South Carolina</option>
|
||||||
|
<option value="SD">South Dakota</option>
|
||||||
|
<option value="TN">Tennessee</option>
|
||||||
|
<option value="TX">Texas</option>
|
||||||
|
<option value="UT">Utah</option>
|
||||||
|
<option value="VT">Vermont</option>
|
||||||
|
<option value="VI">Virgin Islands</option>
|
||||||
|
<option value="VA">Virginia</option>
|
||||||
|
<option value="WA">Washington</option>
|
||||||
|
<option value="WV">West Virginia</option>
|
||||||
|
<option value="WI">Wisconsin</option>
|
||||||
|
<option value="WY">Wyoming</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
# USSocialSecurityNumberField #################################################
|
||||||
|
>>> from django.contrib.localflavor.us.forms import USSocialSecurityNumberField
|
||||||
|
>>> f = USSocialSecurityNumberField()
|
||||||
|
>>> f.clean('987-65-4330')
|
||||||
|
u'987-65-4330'
|
||||||
|
>>> f.clean('987654330')
|
||||||
|
u'987-65-4330'
|
||||||
|
>>> f.clean('078-05-1120')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid U.S. Social Security number in XXX-XX-XXXX format.']
|
||||||
|
"""
|
|
@ -1,7 +1,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Tests to prevent against recurrences of earlier bugs.
|
# Tests to prevent against recurrences of earlier bugs.
|
||||||
|
|
||||||
regression_tests = r"""
|
tests = r"""
|
||||||
It should be possible to re-use attribute dictionaries (#3810)
|
It should be possible to re-use attribute dictionaries (#3810)
|
||||||
>>> from django.newforms import *
|
>>> from django.newforms import *
|
||||||
>>> extra_attrs = {'class': 'special'}
|
>>> extra_attrs = {'class': 'special'}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -3,7 +3,7 @@
|
||||||
Tests for newforms/util.py module.
|
Tests for newforms/util.py module.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
util_tests = r"""
|
tests = r"""
|
||||||
>>> from django.newforms.util import *
|
>>> from django.newforms.util import *
|
||||||
>>> from django.utils.translation import ugettext_lazy
|
>>> from django.utils.translation import ugettext_lazy
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,848 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
tests = r"""
|
||||||
|
>>> from django.newforms import *
|
||||||
|
>>> from django.newforms.widgets import RadioFieldRenderer
|
||||||
|
>>> import datetime
|
||||||
|
>>> import time
|
||||||
|
>>> import re
|
||||||
|
>>> try:
|
||||||
|
... from decimal import Decimal
|
||||||
|
... except ImportError:
|
||||||
|
... from django.utils._decimal import Decimal
|
||||||
|
|
||||||
|
###########
|
||||||
|
# Widgets #
|
||||||
|
###########
|
||||||
|
|
||||||
|
Each Widget class corresponds to an HTML form widget. A Widget knows how to
|
||||||
|
render itself, given a field name and some data. Widgets don't perform
|
||||||
|
validation.
|
||||||
|
|
||||||
|
# TextInput Widget ############################################################
|
||||||
|
|
||||||
|
>>> w = TextInput()
|
||||||
|
>>> w.render('email', '')
|
||||||
|
u'<input type="text" name="email" />'
|
||||||
|
>>> w.render('email', None)
|
||||||
|
u'<input type="text" name="email" />'
|
||||||
|
>>> w.render('email', 'test@example.com')
|
||||||
|
u'<input type="text" name="email" value="test@example.com" />'
|
||||||
|
>>> w.render('email', 'some "quoted" & ampersanded value')
|
||||||
|
u'<input type="text" name="email" value="some "quoted" & ampersanded value" />'
|
||||||
|
>>> w.render('email', 'test@example.com', attrs={'class': 'fun'})
|
||||||
|
u'<input type="text" name="email" value="test@example.com" class="fun" />'
|
||||||
|
|
||||||
|
# Note that doctest in Python 2.4 (and maybe 2.5?) doesn't support non-ascii
|
||||||
|
# characters in output, so we're displaying the repr() here.
|
||||||
|
>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'})
|
||||||
|
u'<input type="text" name="email" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" class="fun" />'
|
||||||
|
|
||||||
|
You can also pass 'attrs' to the constructor:
|
||||||
|
>>> w = TextInput(attrs={'class': 'fun'})
|
||||||
|
>>> w.render('email', '')
|
||||||
|
u'<input type="text" class="fun" name="email" />'
|
||||||
|
>>> w.render('email', 'foo@example.com')
|
||||||
|
u'<input type="text" class="fun" value="foo@example.com" name="email" />'
|
||||||
|
|
||||||
|
'attrs' passed to render() get precedence over those passed to the constructor:
|
||||||
|
>>> w = TextInput(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('email', '', attrs={'class': 'special'})
|
||||||
|
u'<input type="text" class="special" name="email" />'
|
||||||
|
|
||||||
|
# PasswordInput Widget ############################################################
|
||||||
|
|
||||||
|
>>> w = PasswordInput()
|
||||||
|
>>> w.render('email', '')
|
||||||
|
u'<input type="password" name="email" />'
|
||||||
|
>>> w.render('email', None)
|
||||||
|
u'<input type="password" name="email" />'
|
||||||
|
>>> w.render('email', 'test@example.com')
|
||||||
|
u'<input type="password" name="email" value="test@example.com" />'
|
||||||
|
>>> w.render('email', 'some "quoted" & ampersanded value')
|
||||||
|
u'<input type="password" name="email" value="some "quoted" & ampersanded value" />'
|
||||||
|
>>> w.render('email', 'test@example.com', attrs={'class': 'fun'})
|
||||||
|
u'<input type="password" name="email" value="test@example.com" class="fun" />'
|
||||||
|
|
||||||
|
You can also pass 'attrs' to the constructor:
|
||||||
|
>>> w = PasswordInput(attrs={'class': 'fun'})
|
||||||
|
>>> w.render('email', '')
|
||||||
|
u'<input type="password" class="fun" name="email" />'
|
||||||
|
>>> w.render('email', 'foo@example.com')
|
||||||
|
u'<input type="password" class="fun" value="foo@example.com" name="email" />'
|
||||||
|
|
||||||
|
'attrs' passed to render() get precedence over those passed to the constructor:
|
||||||
|
>>> w = PasswordInput(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('email', '', attrs={'class': 'special'})
|
||||||
|
u'<input type="password" class="special" name="email" />'
|
||||||
|
|
||||||
|
>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'})
|
||||||
|
u'<input type="password" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />'
|
||||||
|
|
||||||
|
The render_value argument lets you specify whether the widget should render
|
||||||
|
its value. You may want to do this for security reasons.
|
||||||
|
>>> w = PasswordInput(render_value=True)
|
||||||
|
>>> w.render('email', 'secret')
|
||||||
|
u'<input type="password" name="email" value="secret" />'
|
||||||
|
>>> w = PasswordInput(render_value=False)
|
||||||
|
>>> w.render('email', '')
|
||||||
|
u'<input type="password" name="email" />'
|
||||||
|
>>> w.render('email', None)
|
||||||
|
u'<input type="password" name="email" />'
|
||||||
|
>>> w.render('email', 'secret')
|
||||||
|
u'<input type="password" name="email" />'
|
||||||
|
>>> w = PasswordInput(attrs={'class': 'fun'}, render_value=False)
|
||||||
|
>>> w.render('email', 'secret')
|
||||||
|
u'<input type="password" class="fun" name="email" />'
|
||||||
|
|
||||||
|
# HiddenInput Widget ############################################################
|
||||||
|
|
||||||
|
>>> w = HiddenInput()
|
||||||
|
>>> w.render('email', '')
|
||||||
|
u'<input type="hidden" name="email" />'
|
||||||
|
>>> w.render('email', None)
|
||||||
|
u'<input type="hidden" name="email" />'
|
||||||
|
>>> w.render('email', 'test@example.com')
|
||||||
|
u'<input type="hidden" name="email" value="test@example.com" />'
|
||||||
|
>>> w.render('email', 'some "quoted" & ampersanded value')
|
||||||
|
u'<input type="hidden" name="email" value="some "quoted" & ampersanded value" />'
|
||||||
|
>>> w.render('email', 'test@example.com', attrs={'class': 'fun'})
|
||||||
|
u'<input type="hidden" name="email" value="test@example.com" class="fun" />'
|
||||||
|
|
||||||
|
You can also pass 'attrs' to the constructor:
|
||||||
|
>>> w = HiddenInput(attrs={'class': 'fun'})
|
||||||
|
>>> w.render('email', '')
|
||||||
|
u'<input type="hidden" class="fun" name="email" />'
|
||||||
|
>>> w.render('email', 'foo@example.com')
|
||||||
|
u'<input type="hidden" class="fun" value="foo@example.com" name="email" />'
|
||||||
|
|
||||||
|
'attrs' passed to render() get precedence over those passed to the constructor:
|
||||||
|
>>> w = HiddenInput(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('email', '', attrs={'class': 'special'})
|
||||||
|
u'<input type="hidden" class="special" name="email" />'
|
||||||
|
|
||||||
|
>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'})
|
||||||
|
u'<input type="hidden" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />'
|
||||||
|
|
||||||
|
'attrs' passed to render() get precedence over those passed to the constructor:
|
||||||
|
>>> w = HiddenInput(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('email', '', attrs={'class': 'special'})
|
||||||
|
u'<input type="hidden" class="special" name="email" />'
|
||||||
|
|
||||||
|
# MultipleHiddenInput Widget ##################################################
|
||||||
|
|
||||||
|
>>> w = MultipleHiddenInput()
|
||||||
|
>>> w.render('email', [])
|
||||||
|
u''
|
||||||
|
>>> w.render('email', None)
|
||||||
|
u''
|
||||||
|
>>> w.render('email', ['test@example.com'])
|
||||||
|
u'<input type="hidden" name="email" value="test@example.com" />'
|
||||||
|
>>> w.render('email', ['some "quoted" & ampersanded value'])
|
||||||
|
u'<input type="hidden" name="email" value="some "quoted" & ampersanded value" />'
|
||||||
|
>>> w.render('email', ['test@example.com', 'foo@example.com'])
|
||||||
|
u'<input type="hidden" name="email" value="test@example.com" />\n<input type="hidden" name="email" value="foo@example.com" />'
|
||||||
|
>>> w.render('email', ['test@example.com'], attrs={'class': 'fun'})
|
||||||
|
u'<input type="hidden" name="email" value="test@example.com" class="fun" />'
|
||||||
|
>>> w.render('email', ['test@example.com', 'foo@example.com'], attrs={'class': 'fun'})
|
||||||
|
u'<input type="hidden" name="email" value="test@example.com" class="fun" />\n<input type="hidden" name="email" value="foo@example.com" class="fun" />'
|
||||||
|
|
||||||
|
You can also pass 'attrs' to the constructor:
|
||||||
|
>>> w = MultipleHiddenInput(attrs={'class': 'fun'})
|
||||||
|
>>> w.render('email', [])
|
||||||
|
u''
|
||||||
|
>>> w.render('email', ['foo@example.com'])
|
||||||
|
u'<input type="hidden" class="fun" value="foo@example.com" name="email" />'
|
||||||
|
>>> w.render('email', ['foo@example.com', 'test@example.com'])
|
||||||
|
u'<input type="hidden" class="fun" value="foo@example.com" name="email" />\n<input type="hidden" class="fun" value="test@example.com" name="email" />'
|
||||||
|
|
||||||
|
'attrs' passed to render() get precedence over those passed to the constructor:
|
||||||
|
>>> w = MultipleHiddenInput(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('email', ['foo@example.com'], attrs={'class': 'special'})
|
||||||
|
u'<input type="hidden" class="special" value="foo@example.com" name="email" />'
|
||||||
|
|
||||||
|
>>> w.render('email', ['ŠĐĆŽćžšđ'], attrs={'class': 'fun'})
|
||||||
|
u'<input type="hidden" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />'
|
||||||
|
|
||||||
|
'attrs' passed to render() get precedence over those passed to the constructor:
|
||||||
|
>>> w = MultipleHiddenInput(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('email', ['foo@example.com'], attrs={'class': 'special'})
|
||||||
|
u'<input type="hidden" class="special" value="foo@example.com" name="email" />'
|
||||||
|
|
||||||
|
# FileInput Widget ############################################################
|
||||||
|
|
||||||
|
FileInput widgets don't ever show the value, because the old value is of no use
|
||||||
|
if you are updating the form or if the provided file generated an error.
|
||||||
|
>>> w = FileInput()
|
||||||
|
>>> w.render('email', '')
|
||||||
|
u'<input type="file" name="email" />'
|
||||||
|
>>> w.render('email', None)
|
||||||
|
u'<input type="file" name="email" />'
|
||||||
|
>>> w.render('email', 'test@example.com')
|
||||||
|
u'<input type="file" name="email" />'
|
||||||
|
>>> w.render('email', 'some "quoted" & ampersanded value')
|
||||||
|
u'<input type="file" name="email" />'
|
||||||
|
>>> w.render('email', 'test@example.com', attrs={'class': 'fun'})
|
||||||
|
u'<input type="file" name="email" class="fun" />'
|
||||||
|
|
||||||
|
You can also pass 'attrs' to the constructor:
|
||||||
|
>>> w = FileInput(attrs={'class': 'fun'})
|
||||||
|
>>> w.render('email', '')
|
||||||
|
u'<input type="file" class="fun" name="email" />'
|
||||||
|
>>> w.render('email', 'foo@example.com')
|
||||||
|
u'<input type="file" class="fun" name="email" />'
|
||||||
|
|
||||||
|
>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'})
|
||||||
|
u'<input type="file" class="fun" name="email" />'
|
||||||
|
|
||||||
|
# Textarea Widget #############################################################
|
||||||
|
|
||||||
|
>>> w = Textarea()
|
||||||
|
>>> w.render('msg', '')
|
||||||
|
u'<textarea rows="10" cols="40" name="msg"></textarea>'
|
||||||
|
>>> w.render('msg', None)
|
||||||
|
u'<textarea rows="10" cols="40" name="msg"></textarea>'
|
||||||
|
>>> w.render('msg', 'value')
|
||||||
|
u'<textarea rows="10" cols="40" name="msg">value</textarea>'
|
||||||
|
>>> w.render('msg', 'some "quoted" & ampersanded value')
|
||||||
|
u'<textarea rows="10" cols="40" name="msg">some "quoted" & ampersanded value</textarea>'
|
||||||
|
>>> w.render('msg', 'value', attrs={'class': 'pretty', 'rows': 20})
|
||||||
|
u'<textarea class="pretty" rows="20" cols="40" name="msg">value</textarea>'
|
||||||
|
|
||||||
|
You can also pass 'attrs' to the constructor:
|
||||||
|
>>> w = Textarea(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('msg', '')
|
||||||
|
u'<textarea rows="10" cols="40" name="msg" class="pretty"></textarea>'
|
||||||
|
>>> w.render('msg', 'example')
|
||||||
|
u'<textarea rows="10" cols="40" name="msg" class="pretty">example</textarea>'
|
||||||
|
|
||||||
|
'attrs' passed to render() get precedence over those passed to the constructor:
|
||||||
|
>>> w = Textarea(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('msg', '', attrs={'class': 'special'})
|
||||||
|
u'<textarea rows="10" cols="40" name="msg" class="special"></textarea>'
|
||||||
|
|
||||||
|
>>> w.render('msg', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'})
|
||||||
|
u'<textarea rows="10" cols="40" name="msg" class="fun">\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</textarea>'
|
||||||
|
|
||||||
|
# CheckboxInput Widget ########################################################
|
||||||
|
|
||||||
|
>>> w = CheckboxInput()
|
||||||
|
>>> w.render('is_cool', '')
|
||||||
|
u'<input type="checkbox" name="is_cool" />'
|
||||||
|
>>> w.render('is_cool', None)
|
||||||
|
u'<input type="checkbox" name="is_cool" />'
|
||||||
|
>>> w.render('is_cool', False)
|
||||||
|
u'<input type="checkbox" name="is_cool" />'
|
||||||
|
>>> w.render('is_cool', True)
|
||||||
|
u'<input checked="checked" type="checkbox" name="is_cool" />'
|
||||||
|
|
||||||
|
Using any value that's not in ('', None, False, True) will check the checkbox
|
||||||
|
and set the 'value' attribute.
|
||||||
|
>>> w.render('is_cool', 'foo')
|
||||||
|
u'<input checked="checked" type="checkbox" name="is_cool" value="foo" />'
|
||||||
|
|
||||||
|
>>> w.render('is_cool', False, attrs={'class': 'pretty'})
|
||||||
|
u'<input type="checkbox" name="is_cool" class="pretty" />'
|
||||||
|
|
||||||
|
You can also pass 'attrs' to the constructor:
|
||||||
|
>>> w = CheckboxInput(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('is_cool', '')
|
||||||
|
u'<input type="checkbox" class="pretty" name="is_cool" />'
|
||||||
|
|
||||||
|
'attrs' passed to render() get precedence over those passed to the constructor:
|
||||||
|
>>> w = CheckboxInput(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('is_cool', '', attrs={'class': 'special'})
|
||||||
|
u'<input type="checkbox" class="special" name="is_cool" />'
|
||||||
|
|
||||||
|
You can pass 'check_test' to the constructor. This is a callable that takes the
|
||||||
|
value and returns True if the box should be checked.
|
||||||
|
>>> w = CheckboxInput(check_test=lambda value: value.startswith('hello'))
|
||||||
|
>>> w.render('greeting', '')
|
||||||
|
u'<input type="checkbox" name="greeting" />'
|
||||||
|
>>> w.render('greeting', 'hello')
|
||||||
|
u'<input checked="checked" type="checkbox" name="greeting" value="hello" />'
|
||||||
|
>>> w.render('greeting', 'hello there')
|
||||||
|
u'<input checked="checked" type="checkbox" name="greeting" value="hello there" />'
|
||||||
|
>>> w.render('greeting', 'hello & goodbye')
|
||||||
|
u'<input checked="checked" type="checkbox" name="greeting" value="hello & goodbye" />'
|
||||||
|
|
||||||
|
A subtlety: If the 'check_test' argument cannot handle a value and raises any
|
||||||
|
exception during its __call__, then the exception will be swallowed and the box
|
||||||
|
will not be checked. In this example, the 'check_test' assumes the value has a
|
||||||
|
startswith() method, which fails for the values True, False and None.
|
||||||
|
>>> w.render('greeting', True)
|
||||||
|
u'<input type="checkbox" name="greeting" />'
|
||||||
|
>>> w.render('greeting', False)
|
||||||
|
u'<input type="checkbox" name="greeting" />'
|
||||||
|
>>> w.render('greeting', None)
|
||||||
|
u'<input type="checkbox" name="greeting" />'
|
||||||
|
|
||||||
|
# Select Widget ###############################################################
|
||||||
|
|
||||||
|
>>> w = Select()
|
||||||
|
>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<select name="beatle">
|
||||||
|
<option value="J" selected="selected">John</option>
|
||||||
|
<option value="P">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
If the value is None, none of the options are selected:
|
||||||
|
>>> print w.render('beatle', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<select name="beatle">
|
||||||
|
<option value="J">John</option>
|
||||||
|
<option value="P">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
If the value corresponds to a label (but not to an option value), none of the options are selected:
|
||||||
|
>>> print w.render('beatle', 'John', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<select name="beatle">
|
||||||
|
<option value="J">John</option>
|
||||||
|
<option value="P">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
The value is compared to its str():
|
||||||
|
>>> print w.render('num', 2, choices=[('1', '1'), ('2', '2'), ('3', '3')])
|
||||||
|
<select name="num">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('num', '2', choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
<select name="num">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('num', 2, choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
<select name="num">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
The 'choices' argument can be any iterable:
|
||||||
|
>>> from itertools import chain
|
||||||
|
>>> def get_choices():
|
||||||
|
... for i in range(5):
|
||||||
|
... yield (i, i)
|
||||||
|
>>> print w.render('num', 2, choices=get_choices())
|
||||||
|
<select name="num">
|
||||||
|
<option value="0">0</option>
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
<option value="4">4</option>
|
||||||
|
</select>
|
||||||
|
>>> things = ({'id': 1, 'name': 'And Boom'}, {'id': 2, 'name': 'One More Thing!'})
|
||||||
|
>>> class SomeForm(Form):
|
||||||
|
... somechoice = ChoiceField(choices=chain((('', '-'*9),), [(thing['id'], thing['name']) for thing in things]))
|
||||||
|
>>> f = SomeForm()
|
||||||
|
>>> f.as_table()
|
||||||
|
u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>'
|
||||||
|
>>> f.as_table()
|
||||||
|
u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>'
|
||||||
|
>>> f = SomeForm({'somechoice': 2})
|
||||||
|
>>> f.as_table()
|
||||||
|
u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="">---------</option>\n<option value="1">And Boom</option>\n<option value="2" selected="selected">One More Thing!</option>\n</select></td></tr>'
|
||||||
|
|
||||||
|
You can also pass 'choices' to the constructor:
|
||||||
|
>>> w = Select(choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
>>> print w.render('num', 2)
|
||||||
|
<select name="num">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
If 'choices' is passed to both the constructor and render(), then they'll both be in the output:
|
||||||
|
>>> print w.render('num', 2, choices=[(4, 4), (5, 5)])
|
||||||
|
<select name="num">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
<option value="4">4</option>
|
||||||
|
<option value="5">5</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
>>> w.render('email', 'ŠĐĆŽćžšđ', choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])
|
||||||
|
u'<select name="email">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>'
|
||||||
|
|
||||||
|
If choices is passed to the constructor and is a generator, it can be iterated
|
||||||
|
over multiple times without getting consumed:
|
||||||
|
>>> w = Select(choices=get_choices())
|
||||||
|
>>> print w.render('num', 2)
|
||||||
|
<select name="num">
|
||||||
|
<option value="0">0</option>
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
<option value="4">4</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('num', 3)
|
||||||
|
<select name="num">
|
||||||
|
<option value="0">0</option>
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2">2</option>
|
||||||
|
<option value="3" selected="selected">3</option>
|
||||||
|
<option value="4">4</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
# NullBooleanSelect Widget ####################################################
|
||||||
|
|
||||||
|
>>> w = NullBooleanSelect()
|
||||||
|
>>> print w.render('is_cool', True)
|
||||||
|
<select name="is_cool">
|
||||||
|
<option value="1">Unknown</option>
|
||||||
|
<option value="2" selected="selected">Yes</option>
|
||||||
|
<option value="3">No</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('is_cool', False)
|
||||||
|
<select name="is_cool">
|
||||||
|
<option value="1">Unknown</option>
|
||||||
|
<option value="2">Yes</option>
|
||||||
|
<option value="3" selected="selected">No</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('is_cool', None)
|
||||||
|
<select name="is_cool">
|
||||||
|
<option value="1" selected="selected">Unknown</option>
|
||||||
|
<option value="2">Yes</option>
|
||||||
|
<option value="3">No</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('is_cool', '2')
|
||||||
|
<select name="is_cool">
|
||||||
|
<option value="1">Unknown</option>
|
||||||
|
<option value="2" selected="selected">Yes</option>
|
||||||
|
<option value="3">No</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('is_cool', '3')
|
||||||
|
<select name="is_cool">
|
||||||
|
<option value="1">Unknown</option>
|
||||||
|
<option value="2">Yes</option>
|
||||||
|
<option value="3" selected="selected">No</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
""" + \
|
||||||
|
r""" # [This concatenation is to keep the string below the jython's 32K limit].
|
||||||
|
# SelectMultiple Widget #######################################################
|
||||||
|
|
||||||
|
>>> w = SelectMultiple()
|
||||||
|
>>> print w.render('beatles', ['J'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<select multiple="multiple" name="beatles">
|
||||||
|
<option value="J" selected="selected">John</option>
|
||||||
|
<option value="P">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('beatles', ['J', 'P'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<select multiple="multiple" name="beatles">
|
||||||
|
<option value="J" selected="selected">John</option>
|
||||||
|
<option value="P" selected="selected">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('beatles', ['J', 'P', 'R'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<select multiple="multiple" name="beatles">
|
||||||
|
<option value="J" selected="selected">John</option>
|
||||||
|
<option value="P" selected="selected">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R" selected="selected">Ringo</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
If the value is None, none of the options are selected:
|
||||||
|
>>> print w.render('beatles', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<select multiple="multiple" name="beatles">
|
||||||
|
<option value="J">John</option>
|
||||||
|
<option value="P">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
If the value corresponds to a label (but not to an option value), none of the options are selected:
|
||||||
|
>>> print w.render('beatles', ['John'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<select multiple="multiple" name="beatles">
|
||||||
|
<option value="J">John</option>
|
||||||
|
<option value="P">Paul</option>
|
||||||
|
<option value="G">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
If multiple values are given, but some of them are not valid, the valid ones are selected:
|
||||||
|
>>> print w.render('beatles', ['J', 'G', 'foo'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<select multiple="multiple" name="beatles">
|
||||||
|
<option value="J" selected="selected">John</option>
|
||||||
|
<option value="P">Paul</option>
|
||||||
|
<option value="G" selected="selected">George</option>
|
||||||
|
<option value="R">Ringo</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
The value is compared to its str():
|
||||||
|
>>> print w.render('nums', [2], choices=[('1', '1'), ('2', '2'), ('3', '3')])
|
||||||
|
<select multiple="multiple" name="nums">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('nums', ['2'], choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
<select multiple="multiple" name="nums">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
</select>
|
||||||
|
>>> print w.render('nums', [2], choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
<select multiple="multiple" name="nums">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
The 'choices' argument can be any iterable:
|
||||||
|
>>> def get_choices():
|
||||||
|
... for i in range(5):
|
||||||
|
... yield (i, i)
|
||||||
|
>>> print w.render('nums', [2], choices=get_choices())
|
||||||
|
<select multiple="multiple" name="nums">
|
||||||
|
<option value="0">0</option>
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
<option value="4">4</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
You can also pass 'choices' to the constructor:
|
||||||
|
>>> w = SelectMultiple(choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
>>> print w.render('nums', [2])
|
||||||
|
<select multiple="multiple" name="nums">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
If 'choices' is passed to both the constructor and render(), then they'll both be in the output:
|
||||||
|
>>> print w.render('nums', [2], choices=[(4, 4), (5, 5)])
|
||||||
|
<select multiple="multiple" name="nums">
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="2" selected="selected">2</option>
|
||||||
|
<option value="3">3</option>
|
||||||
|
<option value="4">4</option>
|
||||||
|
<option value="5">5</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
>>> w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])
|
||||||
|
u'<select multiple="multiple" name="nums">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>'
|
||||||
|
|
||||||
|
# RadioSelect Widget ##########################################################
|
||||||
|
|
||||||
|
>>> w = RadioSelect()
|
||||||
|
>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input checked="checked" type="radio" name="beatle" value="J" /> John</label></li>
|
||||||
|
<li><label><input type="radio" name="beatle" value="P" /> Paul</label></li>
|
||||||
|
<li><label><input type="radio" name="beatle" value="G" /> George</label></li>
|
||||||
|
<li><label><input type="radio" name="beatle" value="R" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
If the value is None, none of the options are checked:
|
||||||
|
>>> print w.render('beatle', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="radio" name="beatle" value="J" /> John</label></li>
|
||||||
|
<li><label><input type="radio" name="beatle" value="P" /> Paul</label></li>
|
||||||
|
<li><label><input type="radio" name="beatle" value="G" /> George</label></li>
|
||||||
|
<li><label><input type="radio" name="beatle" value="R" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
If the value corresponds to a label (but not to an option value), none of the options are checked:
|
||||||
|
>>> print w.render('beatle', 'John', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="radio" name="beatle" value="J" /> John</label></li>
|
||||||
|
<li><label><input type="radio" name="beatle" value="P" /> Paul</label></li>
|
||||||
|
<li><label><input type="radio" name="beatle" value="G" /> George</label></li>
|
||||||
|
<li><label><input type="radio" name="beatle" value="R" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
The value is compared to its str():
|
||||||
|
>>> print w.render('num', 2, choices=[('1', '1'), ('2', '2'), ('3', '3')])
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="radio" name="num" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="3" /> 3</label></li>
|
||||||
|
</ul>
|
||||||
|
>>> print w.render('num', '2', choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="radio" name="num" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="3" /> 3</label></li>
|
||||||
|
</ul>
|
||||||
|
>>> print w.render('num', 2, choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="radio" name="num" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="3" /> 3</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
The 'choices' argument can be any iterable:
|
||||||
|
>>> def get_choices():
|
||||||
|
... for i in range(5):
|
||||||
|
... yield (i, i)
|
||||||
|
>>> print w.render('num', 2, choices=get_choices())
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="radio" name="num" value="0" /> 0</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="3" /> 3</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="4" /> 4</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
You can also pass 'choices' to the constructor:
|
||||||
|
>>> w = RadioSelect(choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
>>> print w.render('num', 2)
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="radio" name="num" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="3" /> 3</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
If 'choices' is passed to both the constructor and render(), then they'll both be in the output:
|
||||||
|
>>> print w.render('num', 2, choices=[(4, 4), (5, 5)])
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="radio" name="num" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="3" /> 3</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="4" /> 4</label></li>
|
||||||
|
<li><label><input type="radio" name="num" value="5" /> 5</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
RadioSelect uses a RadioFieldRenderer to render the individual radio inputs.
|
||||||
|
You can manipulate that object directly to customize the way the RadioSelect
|
||||||
|
is rendered.
|
||||||
|
>>> w = RadioSelect()
|
||||||
|
>>> r = w.get_renderer('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
>>> for inp in r:
|
||||||
|
... print inp
|
||||||
|
<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label>
|
||||||
|
<label><input type="radio" name="beatle" value="P" /> Paul</label>
|
||||||
|
<label><input type="radio" name="beatle" value="G" /> George</label>
|
||||||
|
<label><input type="radio" name="beatle" value="R" /> Ringo</label>
|
||||||
|
>>> for inp in r:
|
||||||
|
... print '%s<br />' % inp
|
||||||
|
<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label><br />
|
||||||
|
<label><input type="radio" name="beatle" value="P" /> Paul</label><br />
|
||||||
|
<label><input type="radio" name="beatle" value="G" /> George</label><br />
|
||||||
|
<label><input type="radio" name="beatle" value="R" /> Ringo</label><br />
|
||||||
|
>>> for inp in r:
|
||||||
|
... print '<p>%s %s</p>' % (inp.tag(), inp.choice_label)
|
||||||
|
<p><input checked="checked" type="radio" name="beatle" value="J" /> John</p>
|
||||||
|
<p><input type="radio" name="beatle" value="P" /> Paul</p>
|
||||||
|
<p><input type="radio" name="beatle" value="G" /> George</p>
|
||||||
|
<p><input type="radio" name="beatle" value="R" /> Ringo</p>
|
||||||
|
>>> for inp in r:
|
||||||
|
... print '%s %s %s %s %s' % (inp.name, inp.value, inp.choice_value, inp.choice_label, inp.is_checked())
|
||||||
|
beatle J J John True
|
||||||
|
beatle J P Paul False
|
||||||
|
beatle J G George False
|
||||||
|
beatle J R Ringo False
|
||||||
|
|
||||||
|
You can create your own custom renderers for RadioSelect to use.
|
||||||
|
>>> class MyRenderer(RadioFieldRenderer):
|
||||||
|
... def render(self):
|
||||||
|
... return u'<br />\n'.join([unicode(choice) for choice in self])
|
||||||
|
>>> w = RadioSelect(renderer=MyRenderer)
|
||||||
|
>>> print w.render('beatle', 'G', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<label><input type="radio" name="beatle" value="J" /> John</label><br />
|
||||||
|
<label><input type="radio" name="beatle" value="P" /> Paul</label><br />
|
||||||
|
<label><input checked="checked" type="radio" name="beatle" value="G" /> George</label><br />
|
||||||
|
<label><input type="radio" name="beatle" value="R" /> Ringo</label>
|
||||||
|
|
||||||
|
A RadioFieldRenderer object also allows index access to individual RadioInput
|
||||||
|
objects.
|
||||||
|
>>> w = RadioSelect()
|
||||||
|
>>> r = w.get_renderer('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
>>> print r[1]
|
||||||
|
<label><input type="radio" name="beatle" value="P" /> Paul</label>
|
||||||
|
>>> print r[0]
|
||||||
|
<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label>
|
||||||
|
>>> r[0].is_checked()
|
||||||
|
True
|
||||||
|
>>> r[1].is_checked()
|
||||||
|
False
|
||||||
|
>>> r[1].name, r[1].value, r[1].choice_value, r[1].choice_label
|
||||||
|
('beatle', u'J', u'P', u'Paul')
|
||||||
|
>>> r[10]
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
IndexError: list index out of range
|
||||||
|
|
||||||
|
# Unicode choices are correctly rendered as HTML
|
||||||
|
>>> w = RadioSelect()
|
||||||
|
>>> unicode(w.render('email', 'ŠĐĆŽćžšđ', choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]))
|
||||||
|
u'<ul>\n<li><label><input checked="checked" type="radio" name="email" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="radio" name="email" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>'
|
||||||
|
|
||||||
|
# Attributes provided at instantiation are passed to the constituent inputs
|
||||||
|
>>> w = RadioSelect(attrs={'id':'foo'})
|
||||||
|
>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input checked="checked" type="radio" id="foo_0" value="J" name="beatle" /> John</label></li>
|
||||||
|
<li><label><input type="radio" id="foo_1" value="P" name="beatle" /> Paul</label></li>
|
||||||
|
<li><label><input type="radio" id="foo_2" value="G" name="beatle" /> George</label></li>
|
||||||
|
<li><label><input type="radio" id="foo_3" value="R" name="beatle" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
# Attributes provided at render-time are passed to the constituent inputs
|
||||||
|
>>> w = RadioSelect()
|
||||||
|
>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')), attrs={'id':'bar'})
|
||||||
|
<ul>
|
||||||
|
<li><label><input checked="checked" type="radio" id="bar_0" value="J" name="beatle" /> John</label></li>
|
||||||
|
<li><label><input type="radio" id="bar_1" value="P" name="beatle" /> Paul</label></li>
|
||||||
|
<li><label><input type="radio" id="bar_2" value="G" name="beatle" /> George</label></li>
|
||||||
|
<li><label><input type="radio" id="bar_3" value="R" name="beatle" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
# CheckboxSelectMultiple Widget ###############################################
|
||||||
|
|
||||||
|
>>> w = CheckboxSelectMultiple()
|
||||||
|
>>> print w.render('beatles', ['J'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="beatles" value="J" /> John</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="P" /> Paul</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="G" /> George</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="R" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
>>> print w.render('beatles', ['J', 'P'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="beatles" value="J" /> John</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="beatles" value="P" /> Paul</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="G" /> George</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="R" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
>>> print w.render('beatles', ['J', 'P', 'R'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="beatles" value="J" /> John</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="beatles" value="P" /> Paul</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="G" /> George</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="beatles" value="R" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
If the value is None, none of the options are selected:
|
||||||
|
>>> print w.render('beatles', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="J" /> John</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="P" /> Paul</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="G" /> George</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="R" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
If the value corresponds to a label (but not to an option value), none of the options are selected:
|
||||||
|
>>> print w.render('beatles', ['John'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="J" /> John</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="P" /> Paul</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="G" /> George</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="R" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
If multiple values are given, but some of them are not valid, the valid ones are selected:
|
||||||
|
>>> print w.render('beatles', ['J', 'G', 'foo'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
|
<ul>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="beatles" value="J" /> John</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="P" /> Paul</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="beatles" value="G" /> George</label></li>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value="R" /> Ringo</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
The value is compared to its str():
|
||||||
|
>>> print w.render('nums', [2], choices=[('1', '1'), ('2', '2'), ('3', '3')])
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>
|
||||||
|
</ul>
|
||||||
|
>>> print w.render('nums', ['2'], choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>
|
||||||
|
</ul>
|
||||||
|
>>> print w.render('nums', [2], choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
The 'choices' argument can be any iterable:
|
||||||
|
>>> def get_choices():
|
||||||
|
... for i in range(5):
|
||||||
|
... yield (i, i)
|
||||||
|
>>> print w.render('nums', [2], choices=get_choices())
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="0" /> 0</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="4" /> 4</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
You can also pass 'choices' to the constructor:
|
||||||
|
>>> w = CheckboxSelectMultiple(choices=[(1, 1), (2, 2), (3, 3)])
|
||||||
|
>>> print w.render('nums', [2])
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
If 'choices' is passed to both the constructor and render(), then they'll both be in the output:
|
||||||
|
>>> print w.render('nums', [2], choices=[(4, 4), (5, 5)])
|
||||||
|
<ul>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>
|
||||||
|
<li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="4" /> 4</label></li>
|
||||||
|
<li><label><input type="checkbox" name="nums" value="5" /> 5</label></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
>>> w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])
|
||||||
|
u'<ul>\n<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>\n<li><label><input type="checkbox" name="nums" value="2" /> 2</label></li>\n<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>\n<li><label><input checked="checked" type="checkbox" name="nums" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="checkbox" name="nums" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>'
|
||||||
|
|
||||||
|
# MultiWidget #################################################################
|
||||||
|
|
||||||
|
>>> class MyMultiWidget(MultiWidget):
|
||||||
|
... def decompress(self, value):
|
||||||
|
... if value:
|
||||||
|
... return value.split('__')
|
||||||
|
... return ['', '']
|
||||||
|
... def format_output(self, rendered_widgets):
|
||||||
|
... return u'<br />'.join(rendered_widgets)
|
||||||
|
>>> w = MyMultiWidget(widgets=(TextInput(attrs={'class': 'big'}), TextInput(attrs={'class': 'small'})))
|
||||||
|
>>> w.render('name', ['john', 'lennon'])
|
||||||
|
u'<input type="text" class="big" value="john" name="name_0" /><br /><input type="text" class="small" value="lennon" name="name_1" />'
|
||||||
|
>>> w.render('name', 'john__lennon')
|
||||||
|
u'<input type="text" class="big" value="john" name="name_0" /><br /><input type="text" class="small" value="lennon" name="name_1" />'
|
||||||
|
>>> w.render('name', 'john__lennon', attrs={'id':'foo'})
|
||||||
|
u'<input id="foo_0" type="text" class="big" value="john" name="name_0" /><br /><input id="foo_1" type="text" class="small" value="lennon" name="name_1" />'
|
||||||
|
>>> w = MyMultiWidget(widgets=(TextInput(attrs={'class': 'big'}), TextInput(attrs={'class': 'small'})), attrs={'id': 'bar'})
|
||||||
|
>>> w.render('name', ['john', 'lennon'])
|
||||||
|
u'<input id="bar_0" type="text" class="big" value="john" name="name_0" /><br /><input id="bar_1" type="text" class="small" value="lennon" name="name_1" />'
|
||||||
|
|
||||||
|
# SplitDateTimeWidget #########################################################
|
||||||
|
|
||||||
|
>>> w = SplitDateTimeWidget()
|
||||||
|
>>> w.render('date', '')
|
||||||
|
u'<input type="text" name="date_0" /><input type="text" name="date_1" />'
|
||||||
|
>>> w.render('date', None)
|
||||||
|
u'<input type="text" name="date_0" /><input type="text" name="date_1" />'
|
||||||
|
>>> w.render('date', datetime.datetime(2006, 1, 10, 7, 30))
|
||||||
|
u'<input type="text" name="date_0" value="2006-01-10" /><input type="text" name="date_1" value="07:30:00" />'
|
||||||
|
>>> w.render('date', [datetime.date(2006, 1, 10), datetime.time(7, 30)])
|
||||||
|
u'<input type="text" name="date_0" value="2006-01-10" /><input type="text" name="date_1" value="07:30:00" />'
|
||||||
|
|
||||||
|
You can also pass 'attrs' to the constructor. In this case, the attrs will be
|
||||||
|
included on both widgets.
|
||||||
|
>>> w = SplitDateTimeWidget(attrs={'class': 'pretty'})
|
||||||
|
>>> w.render('date', datetime.datetime(2006, 1, 10, 7, 30))
|
||||||
|
u'<input type="text" class="pretty" value="2006-01-10" name="date_0" /><input type="text" class="pretty" value="07:30:00" name="date_1" />'
|
||||||
|
"""
|
Loading…
Reference in New Issue