mirror of
https://github.com/django/django.git
synced 2025-01-26 18:19:18 +00:00
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
398
tests/regressiontests/forms/extra.py
Normal file
398
tests/regressiontests/forms/extra.py
Normal file
@ -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
|
||||
|
||||
"""
|
1162
tests/regressiontests/forms/fields.py
Normal file
1162
tests/regressiontests/forms/fields.py
Normal file
File diff suppressed because it is too large
Load Diff
1606
tests/regressiontests/forms/forms.py
Normal file
1606
tests/regressiontests/forms/forms.py
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
1
tests/regressiontests/forms/localflavor/__init__.py
Normal file
1
tests/regressiontests/forms/localflavor/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
# -*- coding: utf-8 -*-
|
294
tests/regressiontests/forms/localflavor/ar.py
Normal file
294
tests/regressiontests/forms/localflavor/ar.py
Normal file
@ -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''
|
||||
"""
|
134
tests/regressiontests/forms/localflavor/au.py
Normal file
134
tests/regressiontests/forms/localflavor/au.py
Normal file
@ -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>
|
||||
"""
|
220
tests/regressiontests/forms/localflavor/br.py
Normal file
220
tests/regressiontests/forms/localflavor/br.py
Normal file
@ -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.']
|
||||
"""
|
221
tests/regressiontests/forms/localflavor/ca.py
Normal file
221
tests/regressiontests/forms/localflavor/ca.py
Normal file
@ -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.']
|
||||
"""
|
58
tests/regressiontests/forms/localflavor/ch.py
Normal file
58
tests/regressiontests/forms/localflavor/ch.py
Normal file
@ -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>'
|
||||
"""
|
74
tests/regressiontests/forms/localflavor/cl.py
Normal file
74
tests/regressiontests/forms/localflavor/cl.py
Normal file
@ -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>'
|
||||
"""
|
35
tests/regressiontests/forms/localflavor/de.py
Normal file
35
tests/regressiontests/forms/localflavor/de.py
Normal file
@ -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.']
|
||||
"""
|
99
tests/regressiontests/forms/localflavor/fi.py
Normal file
99
tests/regressiontests/forms/localflavor/fi.py
Normal file
File diff suppressed because one or more lines are too long
224
tests/regressiontests/forms/localflavor/fr.py
Normal file
224
tests/regressiontests/forms/localflavor/fr.py
Normal file
@ -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>
|
||||
"""
|
163
tests/regressiontests/forms/localflavor/generic.py
Normal file
163
tests/regressiontests/forms/localflavor/generic.py
Normal file
@ -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'
|
||||
|
||||
"""
|
103
tests/regressiontests/forms/localflavor/is_.py
Normal file
103
tests/regressiontests/forms/localflavor/is_.py
Normal file
File diff suppressed because one or more lines are too long
62
tests/regressiontests/forms/localflavor/it.py
Normal file
62
tests/regressiontests/forms/localflavor/it.py
Normal file
@ -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.']
|
||||
"""
|
106
tests/regressiontests/forms/localflavor/jp.py
Normal file
106
tests/regressiontests/forms/localflavor/jp.py
Normal file
@ -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>
|
||||
"""
|
72
tests/regressiontests/forms/localflavor/nl.py
Normal file
72
tests/regressiontests/forms/localflavor/nl.py
Normal file
@ -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>'
|
||||
"""
|
61
tests/regressiontests/forms/localflavor/pl.py
Normal file
61
tests/regressiontests/forms/localflavor/pl.py
Normal file
File diff suppressed because one or more lines are too long
31
tests/regressiontests/forms/localflavor/sk.py
Normal file
31
tests/regressiontests/forms/localflavor/sk.py
Normal file
@ -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>'
|
||||
"""
|
48
tests/regressiontests/forms/localflavor/uk.py
Normal file
48
tests/regressiontests/forms/localflavor/uk.py
Normal file
@ -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''
|
||||
"""
|
260
tests/regressiontests/forms/localflavor/us.py
Normal file
260
tests/regressiontests/forms/localflavor/us.py
Normal file
@ -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 -*-
|
||||
# Tests to prevent against recurrences of earlier bugs.
|
||||
|
||||
regression_tests = r"""
|
||||
tests = r"""
|
||||
It should be possible to re-use attribute dictionaries (#3810)
|
||||
>>> from django.newforms import *
|
||||
>>> extra_attrs = {'class': 'special'}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -3,7 +3,7 @@
|
||||
Tests for newforms/util.py module.
|
||||
"""
|
||||
|
||||
util_tests = r"""
|
||||
tests = r"""
|
||||
>>> from django.newforms.util import *
|
||||
>>> from django.utils.translation import ugettext_lazy
|
||||
|
||||
|
848
tests/regressiontests/forms/widgets.py
Normal file
848
tests/regressiontests/forms/widgets.py
Normal file
@ -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…
x
Reference in New Issue
Block a user