Django

Code

Ticket #4092: 4093_6352_nullselect.diff

File 4093_6352_nullselect.diff, 143.4 kB (added by dougn, 1 year ago)

Updated patch with better NullSelect implementation which accepts empty_label on render method, and has full tests

  • django/contrib/localflavor/ca/forms.py

    old new  
    33"""  
    44  
    55from django.newforms import ValidationError  
    6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES  
     6from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES  
    77from django.newforms.util import smart_unicode  
    88from django.utils.translation import gettext, ugettext 
    99import re  
     
    5555                pass 
    5656        raise ValidationError(u'Enter a Canadian province or territory.') 
    5757  
    58 class CAProvinceSelect(Select):  
     58class CAProvinceSelect(NullSelect):  
    5959    """  
    60     A Select widget that uses a list of Canadian provinces and  
     60    A NullSelect widget that uses a list of Canadian provinces and  
    6161    territories as its choices.  
    6262    """  
    6363    def __init__(self, attrs=None):  
  • django/contrib/localflavor/us/forms.py

    old new  
    33""" 
    44 
    55from django.newforms import ValidationError 
    6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
     6from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES 
    77from django.utils.encoding import smart_unicode 
    88from django.utils.translation import ugettext 
    99import re 
     
    9090                pass 
    9191        raise ValidationError(u'Enter a U.S. state or territory.') 
    9292 
    93 class USStateSelect(Select): 
     93class USStateSelect(NullSelect): 
    9494    """ 
    95     A Select widget that uses a list of U.S. states/territories as its choices. 
     95    A NullSelect widget that uses a list of U.S. states/territories as its choices. 
    9696    """ 
    9797    def __init__(self, attrs=None): 
    9898        from us_states import STATE_CHOICES 
  • django/contrib/localflavor/de/forms.py

    old new  
    33""" 
    44 
    55from django.newforms import ValidationError 
    6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
     6from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES 
    77from django.utils.translation import ugettext 
    88import re 
    99 
     
    1616            error_message=ugettext('Enter a zip code in the format XXXXX.'), 
    1717                    *args, **kwargs) 
    1818 
    19 class DEStateSelect(Select): 
     19class DEStateSelect(NullSelect): 
    2020    """ 
    21     A Select widget that uses a list of DE states as its choices. 
     21    A NullSelect widget that uses a list of DE states as its choices. 
    2222    """ 
    2323    def __init__(self, attrs=None): 
    2424        from de_states import STATE_CHOICES 
  • django/contrib/localflavor/ch/forms.py

    old new  
    33""" 
    44 
    55from django.newforms import ValidationError 
    6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
     6from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES 
    77from django.utils.encoding import smart_unicode 
    88from django.utils.translation import ugettext 
    99import re 
     
    3535            return u'%s %s %s %s' % (value[0:3], value[3:6], value[6:8], value[8:10]) 
    3636        raise ValidationError('Phone numbers must be in 0XX XXX XX XX format.') 
    3737 
    38 class CHStateSelect(Select): 
     38class CHStateSelect(NullSelect): 
    3939    """ 
    40     A Select widget that uses a list of CH states as its choices. 
     40    A NullSelect widget that uses a list of CH states as its choices. 
    4141    """ 
    4242    def __init__(self, attrs=None): 
    4343        from ch_states import STATE_CHOICES # relative import 
  • django/contrib/localflavor/cl/forms.py

    old new  
    33""" 
    44 
    55from django.newforms import ValidationError 
    6 from django.newforms.fields import RegexField, Select, EMPTY_VALUES 
     6from django.newforms.fields import RegexField, NullSelect, EMPTY_VALUES 
    77from django.utils.translation import ugettext 
    88from django.utils.encoding import smart_unicode 
    99 
    1010 
    11 class CLRegionSelect(Select): 
     11class CLRegionSelect(NullSelect): 
    1212    """ 
    13     A Select widget that uses a list of Chilean Regions (Regiones) 
     13    A NullSelect widget that uses a list of Chilean Regions (Regiones) 
    1414    as its choices. 
    1515    """ 
    1616    def __init__(self, attrs=None): 
  • django/contrib/localflavor/fi/forms.py

    old new  
    44 
    55import re 
    66from django.newforms import ValidationError 
    7 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
     7from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES 
    88from django.utils.translation import ugettext 
    99 
    1010class FIZipCodeField(RegexField): 
     
    1414            error_message=ugettext('Enter a zip code in the format XXXXX.'), 
    1515                    *args, **kwargs) 
    1616 
    17 class FIMunicipalitySelect(Select): 
     17class FIMunicipalitySelect(NullSelect): 
    1818    """ 
    19     A Select widget that uses a list of Finnish municipalities as its choices. 
     19    A NullSelect widget that uses a list of Finnish municipalities as its choices. 
    2020    """ 
    2121    def __init__(self, attrs=None): 
    2222        from fi_municipalities import MUNICIPALITY_CHOICES 
  • django/contrib/localflavor/ar/forms.py

    old new  
    44""" 
    55 
    66from django.newforms import ValidationError 
    7 from django.newforms.fields import RegexField, CharField, Select, EMPTY_VALUES 
     7from django.newforms.fields import RegexField, CharField, NullSelect, EMPTY_VALUES 
    88from django.utils.encoding import smart_unicode 
    99from django.utils.translation import ugettext 
    1010import re 
    1111 
    12 class ARProvinceSelect(Select): 
     12class ARProvinceSelect(NullSelect): 
    1313    """ 
    14     A Select widget that uses a list of Argentinean provinces/autonomous cities 
     14    A NullSelect widget that uses a list of Argentinean provinces/autonomous cities 
    1515    as its choices. 
    1616    """ 
    1717    def __init__(self, attrs=None): 
  • django/contrib/localflavor/br/forms.py

    old new  
    44""" 
    55 
    66from django.newforms import ValidationError 
    7 from django.newforms.fields import Field, RegexField, CharField, Select, EMPTY_VALUES 
     7from django.newforms.fields import Field, RegexField, CharField, NullSelect, EMPTY_VALUES 
    88from django.utils.encoding import smart_unicode 
    99from django.utils.translation import ugettext as _ 
    1010import re 
     
    3434            return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3)) 
    3535        raise ValidationError(_('Phone numbers must be in XX-XXXX-XXXX format.')) 
    3636 
    37 class BRStateSelect(Select): 
     37class BRStateSelect(NullSelect): 
    3838    """ 
    39     A Select widget that uses a list of Brazilian states/territories 
     39    A NullSelect widget that uses a list of Brazilian states/territories 
    4040    as its choices. 
    4141    """ 
    4242    def __init__(self, attrs=None): 
     
    4747    """ 
    4848    A choice field that uses a list of Brazilian states as its choices. 
    4949    """ 
    50     widget = Select 
    51  
    52     def __init__(self, required=True, widget=None, label=None, 
     50    def __init__(self, required=True, widget=NullSelect, label=None, 
    5351                 initial=None, help_text=None): 
     52        from br_states import STATE_CHOICES 
     53        if isinstance(widget, type): 
     54            widget = widget(choices=STATE_CHOICES) 
     55        else: 
     56            widget.choices = STATE_CHOICES 
    5457        super(BRStateChoiceField, self).__init__(required, widget, label, 
    5558                                                 initial, help_text) 
    56         from br_states import STATE_CHOICES 
    57         self.widget.choices = STATE_CHOICES 
    5859 
    5960    def clean(self, value): 
    6061        value = super(BRStateChoiceField, self).clean(value) 
  • django/contrib/localflavor/au/forms.py

    old new  
    33""" 
    44 
    55from django.newforms import ValidationError 
    6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
     6from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES 
    77from django.newforms.util import smart_unicode 
    88from django.utils.translation import ugettext 
    99import re 
     
    3333            return u'%s' % phone_match.group(1) 
    3434        raise ValidationError(u'Phone numbers must contain 10 digits.') 
    3535 
    36 class AUStateSelect(Select): 
     36class AUStateSelect(NullSelect): 
    3737    """ 
    38     A Select widget that uses a list of Australian states/territories as its 
     38    A NullSelect widget that uses a list of Australian states/territories as its 
    3939    choices. 
    4040    """ 
    4141    def __init__(self, attrs=None): 
  • django/contrib/localflavor/in_/forms.py

    old new  
    33""" 
    44 
    55from django.newforms import ValidationError 
    6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
     6from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES 
    77from django.utils.encoding import smart_unicode 
    88from django.utils.translation import gettext 
    99import re 
     
    3838                pass 
    3939        raise ValidationError(u'Enter a Indian state or territory.') 
    4040 
    41 class INStateSelect(Select): 
     41class INStateSelect(NullSelect): 
    4242    """ 
    43     A Select widget that uses a list of Indian states/territories as its 
     43    A NullSelect widget that uses a list of Indian states/territories as its 
    4444    choices. 
    4545    """ 
    4646    def __init__(self, attrs=None): 
  • django/contrib/localflavor/fr/forms.py

    old new  
    33""" 
    44 
    55from django.newforms import ValidationError 
    6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
     6from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES 
    77from django.utils.encoding import smart_unicode 
    88from django.utils.translation import ugettext 
    99import re 
     
    3434            return u'%s %s %s %s %s' % (value[0:2], value[2:4], value[4:6], value[6:8], value[8:10]) 
    3535        raise ValidationError(u'Phone numbers must be in 0X XX XX XX XX format.') 
    3636 
    37 class FRDepartmentSelect(Select): 
     37class FRDepartmentSelect(NullSelect): 
    3838    """ 
    39     A Select widget that uses a list of FR departments as its choices. 
     39    A NullSelect widget that uses a list of FR departments as its choices. 
    4040    """ 
    4141    def __init__(self, attrs=None): 
    4242        from fr_department import DEPARTMENT_ASCII_CHOICES 
  • django/contrib/localflavor/jp/forms.py

    old new  
    55from django.core import validators 
    66from django.newforms import ValidationError 
    77from django.utils.translation import ugettext 
    8 from django.newforms.fields import RegexField, Select 
     8from django.newforms.fields import RegexField, NullSelect 
    99 
    1010import re 
    1111 
     
    2929        v = super(JPPostalCodeField, self).clean(value) 
    3030        return v.replace('-', '') 
    3131 
    32 class JPPrefectureSelect(Select): 
     32class JPPrefectureSelect(NullSelect): 
    3333    """ 
    34     A Select widget that uses a list of Japanese prefectures as its choices. 
     34    A NullSelect widget that uses a list of Japanese prefectures as its choices. 
    3535    """ 
    3636    def __init__(self, attrs=None): 
    3737        from jp_prefectures import JP_PREFECTURES 
  • django/contrib/localflavor/nl/forms.py

    old new  
    55import re 
    66 
    77from django.newforms import ValidationError 
    8 from django.newforms.fields import Field, Select, EMPTY_VALUES 
     8from django.newforms.fields import Field, NullSelect, EMPTY_VALUES 
    99from django.utils.translation import ugettext as _ 
    1010from django.utils.encoding import smart_unicode 
    1111 
     
    3232         
    3333        return u'%s %s' % (value[:4], value[4:]) 
    3434 
    35 class NLProvinceSelect(Select): 
     35class NLProvinceSelect(NullSelect): 
    3636    """ 
    37     A Select widget that uses a list of provinces of the Netherlands as its  
     37    A NullSelect widget that uses a list of provinces of the Netherlands as its  
    3838    choices. 
    3939    """ 
    4040    def __init__(self, attrs=None): 
  • django/contrib/localflavor/is_/forms.py

    old new  
    44 
    55from django.newforms import ValidationError 
    66from django.newforms.fields import RegexField, EMPTY_VALUES 
    7 from django.newforms.widgets import Select 
     7from django.newforms.widgets import NullSelect 
    88from django.utils.translation import ugettext 
    99from django.utils.encoding import smart_unicode 
    1010 
     
    6868 
    6969        return value.replace('-', '').replace(' ', '') 
    7070 
    71 class ISPostalCodeSelect(Select): 
     71class ISPostalCodeSelect(NullSelect): 
    7272    """ 
    73     A Select widget that uses a list of Icelandic postal codes as its choices. 
     73    A NullSelect widget that uses a list of Icelandic postal codes as its choices. 
    7474    """ 
    7575    def __init__(self, attrs=None): 
    7676        from is_postalcodes import IS_POSTALCODES 
  • django/contrib/localflavor/pl/forms.py

    old new  
    33""" 
    44 
    55from django.newforms import ValidationError 
    6 from django.newforms.fields import Select, RegexField 
     6from django.newforms.fields import NullSelect, RegexField 
    77from django.utils.translation import ugettext as _ 
    88 
    9 class PLVoivodeshipSelect(Select): 
     9class PLVoivodeshipSelect(NullSelect): 
    1010    """ 
    1111    A select widget with list of Polish voivodeships (administrative provinces) 
    1212    as choices. 
     
    1515        from pl_voivodeships import VOIVODESHIP_CHOICES 
    1616        super(PLVoivodeshipSelect, self).__init__(attrs, choices=VOIVODESHIP_CHOICES) 
    1717 
    18 class PLAdministrativeUnitSelect(Select): 
     18class PLAdministrativeUnitSelect(NullSelect): 
    1919    """ 
    2020    A select widget with list of Polish administrative units as choices. 
    2121    """ 
  • django/contrib/localflavor/no/forms.py

    old new  
    44 
    55import re, datetime 
    66from django.newforms import ValidationError 
    7 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
     7from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES 
    88from django.utils.translation import ugettext 
    99 
    1010class NOZipCodeField(RegexField): 
     
    1414            error_message=ugettext('Enter a zip code in the format XXXX.'), 
    1515                    *args, **kwargs) 
    1616 
    17 class NOMunicipalitySelect(Select): 
     17class NOMunicipalitySelect(NullSelect): 
    1818    """ 
    19     A Select widget that uses a list of Norwegian municipalities (fylker) 
     19    A NullSelect widget that uses a list of Norwegian municipalities (fylker) 
    2020    as its choices. 
    2121    """ 
    2222    def __init__(self, attrs=None): 
  • django/contrib/localflavor/it/forms.py

    old new  
    33""" 
    44 
    55from django.newforms import ValidationError 
    6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
     6from django.newforms.fields import Field, RegexField, NullSelect, EMPTY_VALUES 
    77from django.utils.translation import ugettext 
    88from django.utils.encoding import smart_unicode 
    99from django.contrib.localflavor.it.util import ssn_check_digit, vat_number_check_digit 
     
    1616        error_message=ugettext('Enter a valid zip code.'), 
    1717                *args, **kwargs) 
    1818 
    19 class ITRegionSelect(Select): 
     19class ITRegionSelect(NullSelect): 
    2020    """ 
    21     A Select widget that uses a list of IT regions as its choices. 
     21    A NullSelect widget that uses a list of IT regions as its choices. 
    2222    """ 
    2323    def __init__(self, attrs=None): 
    2424        from it_region import REGION_CHOICES 
    2525        super(ITRegionSelect, self).__init__(attrs, choices=REGION_CHOICES) 
    2626 
    27 class ITProvinceSelect(Select): 
     27class ITProvinceSelect(NullSelect): 
    2828    """ 
    29     A Select widget that uses a list of IT regions as its choices. 
     29    A NullSelect widget that uses a list of IT regions as its choices. 
    3030    """ 
    3131    def __init__(self, attrs=None): 
    3232        from it_province import PROVINCE_CHOICES 
  • django/contrib/localflavor/sk/forms.py

    old new  
    22Slovak-specific form helpers 
    33""" 
    44 
    5 from django.newforms.fields import Select, RegexField 
     5from django.newforms.fields import NullSelect, RegexField 
    66from django.utils.translation import ugettext 
    77 
    8 class SKRegionSelect(Select): 
     8class SKRegionSelect(NullSelect): 
    99    """ 
    1010    A select widget widget with list of Slovak regions as choices. 
    1111    """ 
     
    1313        from sk_regions import REGION_CHOICES 
    1414        super(SKRegionSelect, self).__init__(attrs, choices=REGION_CHOICES) 
    1515 
    16 class SKDistrictSelect(Select): 
     16class SKDistrictSelect(NullSelect): 
    1717    """ 
    1818    A select widget with list of Slovak districts as choices. 
    1919    """ 
  • django/newforms/models.py

    old new  
    1010from util import ValidationError 
    1111from forms import BaseForm, SortedDictFromList 
    1212from fields import Field, ChoiceField 
    13 from widgets import Select, SelectMultiple, MultipleHiddenInput 
     13from widgets import NullSelect, SelectMultiple, MultipleHiddenInput 
    1414 
    1515__all__ = ( 
    1616    'save_instance', 'form_for_model', 'form_for_instance', 'form_for_fields', 
     
    123123    return type('FormForFields', (BaseForm,), {'base_fields': fields}) 
    124124 
    125125class QuerySetIterator(object): 
    126     def __init__(self, queryset, empty_label, cache_choices): 
    127         self.queryset, self.empty_label, self.cache_choices = queryset, empty_label, cache_choices 
     126    def __init__(self, base, queryset, cache_choices): 
     127        self.base, self.queryset, self.cache_choices = base, queryset, cache_choices 
    128128 
    129129    def __iter__(self): 
    130         if self.empty_label is not None: 
    131             yield (u"", self.empty_label) 
     130        for obj in self.base: 
     131            yield obj 
    132132        for obj in self.queryset: 
    133133            yield (obj._get_pk_val(), smart_unicode(obj)) 
    134134        # Clear the QuerySet cache if required. 
     
    139139    "A ChoiceField whose choices are a model QuerySet." 
    140140    # This class is a subclass of ChoiceField for purity, but it doesn't 
    141141    # actually use any of ChoiceField's implementation. 
    142     def __init__(self, queryset, empty_label=u"---------", cache_choices=False, 
    143             required=True, widget=Select, label=None, initial=None, help_text=None): 
     142    def __init__(self, queryset, cache_choices=False, 
     143            required=True, widget=NullSelect, label=None, initial=None, help_text=None): 
    144144        self.queryset = queryset 
    145         self.empty_label = empty_label 
    146145        self.cache_choices = cache_choices 
    147146        # Call Field instead of ChoiceField __init__() because we don't need 
    148147        # ChoiceField.__init__(). 
    149148        Field.__init__(self, required, widget, label, initial, help_text) 
     149        # we need to keep the choices list as a lazy evaluation. 
     150        self.base = self.widget.choices 
    150151        self.widget.choices = self.choices 
    151152 
    152153    def _get_choices(self): 
     
    160161        # *each* time _get_choices() is called (and, thus, each time 
    161162        # self.choices is accessed) so that we can ensure the QuerySet has not 
    162163        # been consumed. 
    163         return QuerySetIterator(self.queryset, self.empty_label, self.cache_choices) 
     164        return QuerySetIterator(self.base, self.queryset, self.cache_choices) 
    164165 
    165166    def _set_choices(self, value): 
    166167        # This method is copied from ChoiceField._set_choices(). It's necessary 
     
    185186    hidden_widget = MultipleHiddenInput 
    186187    def __init__(self, queryset, cache_choices=False, required=True, 
    187188            widget=SelectMultiple, label=None, initial=None, help_text=None): 
    188         super(ModelMultipleChoiceField, self).__init__(queryset, None, cache_choices, 
     189        super(ModelMultipleChoiceField, self).__init__(queryset, cache_choices, 
    189190            required, widget, label, initial, help_text) 
    190191 
    191192    def clean(self, value): 
  • django/newforms/fields.py

    old new  
    1111from django.utils.encoding import StrAndUnicode, smart_unicode 
    1212 
    1313from util import ErrorList, ValidationError 
    14 from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple 
     14from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullSelect, NullBooleanSelect, SelectMultiple 
    1515 
    1616try: 
    1717    from decimal import Decimal, DecimalException 
  • django/newforms/widgets.py

    old new  
    1818    'Widget', 'TextInput', 'PasswordInput', 
    1919    'HiddenInput', 'MultipleHiddenInput', 
    2020    'FileInput', 'Textarea', 'CheckboxInput', 
    21     'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect', 
     21    'Select', 'NullSelect', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect', 
    2222    'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget', 
    2323) 
    2424 
     
    182182        output.append(u'</select>') 
    183183        return u'\n'.join(output) 
    184184 
     185class NullSelect(Select): 
     186    def __init__(self, attrs=None, choices=(), empty_label=u"---------"): 
     187        self.empty_label = empty_label 
     188        super(NullSelect, self).__init__(attrs, choices) 
     189     
     190    def render(self, name, value, attrs=None, choices=(), **kwdargs): 
     191        empty_choice = () 
     192        # kwdargs is needed because it is the only way to determine if an 
     193        # override is provided or not. 
     194        if 'empty_label' in kwdargs: 
     195            if kwdargs['empty_label'] is not None: 
     196                empty_choice = ((u'', kwdargs['empty_label']),) 
     197        elif self.empty_label is not None: 
     198            empty_choice = ((u'', self.empty_label),) 
     199        base_choices = self.choices 
     200        self.choices = chain(empty_choice, base_choices) 
     201        result = super(NullSelect, self).render(name, value, attrs, choices) 
     202        self.choices = base_choices 
     203        return result 
     204         
     205         
    185206class NullBooleanSelect(Select): 
    186207    """ 
    187208    A Select Widget intended to be used with NullBooleanField. 
  • tests/regressiontests/forms/tests.py

    old new  
    396396<option value="4">4</option> 
    397397</select> 
    398398 
     399# NullSelect Widget ########################################################### 
     400 
     401>>> w = NullSelect() 
     402>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) 
     403<select name="beatle"> 
     404<option value="">---------</option> 
     405<option value="J" selected="selected">John</option> 
     406<option value="P">Paul</option> 
     407<option value="G">George</option> 
     408<option value="R">Ringo</option> 
     409</select> 
     410 
     411If the value is None, the empty option is selected: 
     412>>> print w.render('beatle', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) 
     413<select name="beatle"> 
     414<option value="" selected="selected">---------</option> 
     415<option value="J">John</option> 
     416<option value="P">Paul</option> 
     417<option value="G">George</option> 
     418<option value="R">Ringo</option> 
     419</select> 
     420 
     421Override the default empty_label: 
     422>>> w = NullSelect(choices=(('F', 'Fuji'), ('G', 'Granny Smith'), ('M', 'McIntosh')), empty_label="I don't like apples") 
     423>>> print w.render('apples', None) 
     424<select name="apples"> 
     425<option value="" selected="selected">I don&#39;t like apples</option> 
     426<option value="F">Fuji</option> 
     427<option value="G">Granny Smith</option> 
     428<option value="M">McIntosh</option> 
     429</select> 
     430 
     431Override the empty_label override: 
     432>> print w.render('apples', 'R', choices=(('R', 'Red Delicious'), ('C', 'Cameo')), empty_label='No preference') 
     433<select name="apples"> 
     434<option value="">No preference</option> 
     435<option value="F">Fuji</option> 
     436<option value="G">Granny Smith</option> 
     437<option value="M">McIntosh</option> 
     438<option value="R" selected="selected">Red Delicious</option> 
     439<option value="C">Cameo</option> 
     440</select> 
     441 
     442>> print w.render('apples', None, empty_label=None) 
     443<select name="apples"> 
     444<option value="F">Fuji</option> 
     445<option value="G">Granny Smith</option> 
     446<option value="M">McIntosh</option> 
     447</select> 
     448 
     449>>> w = NullSelect(empty_label=None) 
     450>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) 
     451<select name="beatle"> 
     452<option value="J" selected="selected">John</option> 
     453<option value="P">Paul</option> 
     454<option value="G">George</option> 
     455<option value="R">Ringo</option> 
     456</select> 
     457 
     458>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')), empty_label='XXX') 
     459<select name="beatle"> 
     460<option value="">XXX</option> 
     461<option value="J" selected="selected">John</option> 
     462<option value="P">Paul</option> 
     463<option value="G">George</option> 
     464<option value="R">Ringo</option> 
     465</select> 
     466 
    399467# NullBooleanSelect Widget #################################################### 
    400468 
    401469>>> w = NullBooleanSelect() 
  • tests/regressiontests/forms/localflavor.py

    old new  
    179179 
    180180# USStateSelect ############################################################### 
    181181 
    182 USStateSelect is a Select widget that uses a list of U.S. states/territories 
     182USStateSelect is a NullSelect widget that uses a list of U.S. states/territories 
    183183as its choices. 
    184184>>> from django.contrib.localflavor.us.forms import USStateSelect 
    185185>>> w = USStateSelect() 
    186186>>> print w.render('state', 'IL') 
    187187<select name="state"> 
     188<option value="">---------</option> 
    188189<option value="AL">Alabama</option> 
    189190<option value="AK">Alaska</option> 
    190191<option value="AS">American Samoa</option> 
     
    406407 
    407408# FRDepartmentSelect ############################################################### 
    408409 
    409 FRDepartmentSelect is a Select widget that uses a list of french departments 
     410FRDepartmentSelect is a NullSelect widget that uses a list of french departments 
    410411including DOM TOM 
    411412>>> from django.contrib.localflavor.fr.forms import FRDepartmentSelect 
    412413>>> w = FRDepartmentSelect() 
    413414>>> print w.render('dep', 'Paris') 
    414415<select name="dep"> 
     416<option value="">---------</option> 
    415417<option value="01">01 - Ain</option> 
    416418<option value="02">02 - Aisne</option> 
    417419<option value="03">03 - Allier</option> 
     
    570572 
    571573# JPPrefectureSelect ############################################################### 
    572574 
    573 A Select widget that uses a list of Japanese prefectures as its choices. 
     575A NullSelect widget that uses a list of Japanese prefectures as its choices. 
    574576>>> from django.contrib.localflavor.jp.forms import JPPrefectureSelect 
    575577>>> w = JPPrefectureSelect() 
    576578>>> print w.render('prefecture', 'kanagawa') 
    577579<select name="prefecture"> 
     580<option value="">---------</option> 
    578581<option value="hokkaido">Hokkaido</option> 
    579582<option value="aomori">Aomori</option> 
    580583<option value="iwate">Iwate</option> 
     
    640643>>> from django.contrib.localflavor.it.forms import ITRegionSelect 
    641644>>> w = ITRegionSelect() 
    642645>>> w.render('regions', 'PMN') 
    643 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>' 
     646u'<select name="regions">\n<option value="">---------</option>\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>' 
    644647 
    645648# ITSocialSecurityNumberField ################################################# 
    646649 
     
    728731 
    729732# FIMunicipalitySelect ############################################################### 
    730733 
    731 A Select widget that uses a list of Finnish municipalities as its choices. 
     734A NullSelect widget that uses a list of Finnish municipalities as its choices. 
    732735>>> from django.contrib.localflavor.fi.forms import FIMunicipalitySelect 
    733736>>> w = FIMunicipalitySelect() 
    734737>>> unicode(w.render('municipalities', 'turku')) 
    735 u'<select name="municipalities">\n<option value="akaa">Akaa</option>\n<option value="alaharma">Alah\xe4rm\xe4</option>\n<option value="alajarvi">Alaj\xe4rvi</option>\n<option value="alastaro">Alastaro</option>\n<option value="alavieska">Alavieska</option>\n<option value="alavus">Alavus</option>\n<option value="anjalankoski">Anjalankoski</option>\n<option value="artjarvi">Artj\xe4rvi</option>\n<option value="asikkala">Asikkala</option>\n<option value="askainen">Askainen</option>\n<option value="askola">Askola</option>\n<option value="aura">Aura</option>\n<option value="brando">Br\xe4nd\xf6</option>\n<option value="dragsfjard">Dragsfj\xe4rd</option>\n<option value="eckero">Ecker\xf6</option>\n<option value="elimaki">Elim\xe4ki</option>\n<option value="eno">Eno</option>\n<option value="enonkoski">Enonkoski</option>\n<option value="enontekio">Enonteki\xf6</option>\n<option value="espoo">Espoo</option>\n<option value="eura">Eura</option>\n<option value="eurajoki">Eurajoki</option>\n<option value="evijarvi">Evij\xe4rvi</option>\n<option value="finstrom">Finstr\xf6m</option>\n<option value="forssa">Forssa</option>\n<option value="foglo">F\xf6gl\xf6</option>\n<option value="geta">Geta</option>\n<option value="haapajarvi">Haapaj\xe4rvi</option>\n<option value="haapavesi">Haapavesi</option>\n<option value="hailuoto">Hailuoto</option>\n<option value="halikko">Halikko</option>\n<option value="halsua">Halsua</option>\n<option value="hamina">Hamina</option>\n<option value="hammarland">Hammarland</option>\n<option value="hankasalmi">Hankasalmi</option>\n<option value="hanko">Hanko</option>\n<option value="harjavalta">Harjavalta</option>\n<option value="hartola">Hartola</option>\n<option value="hattula">Hattula</option>\n<option value="hauho">Hauho</option>\n<option value="haukipudas">Haukipudas</option>\n<option value="hausjarvi">Hausj\xe4rvi</option>\n<option value="heinola">Heinola</option>\n<option value="heinavesi">Hein\xe4vesi</option>\n<option value="helsinki">Helsinki</option>\n<option value="himanka">Himanka</option>\n<option value="hirvensalmi">Hirvensalmi</option>\n<option value="hollola">Hollola</option>\n<option value="honkajoki">Honkajoki</option>\n<option value="houtskari">Houtskari</option>\n<option value="huittinen">Huittinen</option>\n<option value="humppila">Humppila</option>\n<option value="hyrynsalmi">Hyrynsalmi</option>\n<option value="hyvinkaa">Hyvink\xe4\xe4</option>\n<option value="hameenkoski">H\xe4meenkoski</option>\n<option value="hameenkyro">H\xe4meenkyr\xf6</option>\n<option value="hameenlinna">H\xe4meenlinna</option>\n<option value="ii">Ii</option>\n<option value="iisalmi">Iisalmi</option>\n<option value="iitti">Iitti</option>\n<option value="ikaalinen">Ikaalinen</option>\n<option value="ilmajoki">Ilmajoki</option>\n<option value="ilomantsi">Ilomantsi</option>\n<option value="imatra">Imatra</option>\n<option value="inari">Inari</option>\n<option value="inio">Ini\xf6</option>\n<option value="inkoo">Inkoo</option>\n<option value="isojoki">Isojoki</option>\n<option value="isokyro">Isokyr\xf6</option>\n<option value="jaala">Jaala</option>\n<option value="jalasjarvi">Jalasj\xe4rvi</option>\n<option value="janakkala">Janakkala</option>\n<option value="joensuu">Joensuu</option>\n<option value="jokioinen">Jokioinen</option>\n<option value="jomala">Jomala</option>\n<option value="joroinen">Joroinen</option>\n<option value="joutsa">Joutsa</option>\n<option value="joutseno">Joutseno</option>\n<option value="juankoski">Juankoski</option>\n<option value="jurva">Jurva</option>\n<option value="juuka">Juuka</option>\n<option value="juupajoki">Juupajoki</option>\n<option value="juva">Juva</option>\n<option value="jyvaskyla">Jyv\xe4skyl\xe4</option>\n<option value="jyvaskylan_mlk">Jyv\xe4skyl\xe4n maalaiskunta</option>\n<option value="jamijarvi">J\xe4mij\xe4rvi</option>\n<option value="jamsa">J\xe4ms\xe4</option>\n<option value="jamsankoski">J\xe4ms\xe4nkoski</option>\n<option value="jarvenpaa">J\xe4rvenp\xe4\xe4</option>\n<option value="kaarina">Kaarina</option>\n<option value="kaavi">Kaavi</option>\n<option value="kajaani">Kajaani</option>\n<option value="kalajoki">Kalajoki</option>\n<option value="kalvola">Kalvola</option>\n<option value="kangasala">Kangasala</option>\n<option value="kangasniemi">Kangasniemi</option>\n<option value="kankaanpaa">Kankaanp\xe4\xe4</option>\n<option value="kannonkoski">Kannonkoski</option>\n<option value="kannus">Kannus</option>\n<option value="karijoki">Karijoki</option>\n<option value="karjaa">Karjaa</option>\n<option value="karjalohja">Karjalohja</option>\n<option value="karkkila">Karkkila</option>\n<option value="karstula">Karstula</option>\n<option value="karttula">Karttula</option>\n<option value="karvia">Karvia</option>\n<option value="kaskinen">Kaskinen</option>\n<option value="kauhajoki">Kauhajoki</option>\n<option value="kauhava">Kauhava</option>\n<option value="kauniainen">Kauniainen</option>\n<option value="kaustinen">Kaustinen</option>\n<option value="keitele">Keitele</option>\n<option value="kemi">Kemi</option>\n<option value="kemijarvi">Kemij\xe4rvi</option>\n<option value="keminmaa">Keminmaa</option>\n<option value="kemio">Kemi\xf6</option>\n<option value="kempele">Kempele</option>\n<option value="kerava">Kerava</option>\n<option value="kerimaki">Kerim\xe4ki</option>\n<option value="kestila">Kestil\xe4</option>\n<option value="kesalahti">Kes\xe4lahti</option>\n<option value="keuruu">Keuruu</option>\n<option value="kihnio">Kihni\xf6</option>\n<option value="kiikala">Kiikala</option>\n<option value="kiikoinen">Kiikoinen</option>\n<option value="kiiminki">Kiiminki</option>\n<option value="kinnula">Kinnula</option>\n<option value="kirkkonummi">Kirkkonummi</option>\n<option value="kisko">Kisko</option>\n<option value="kitee">Kitee</option>\n<option value="kittila">Kittil\xe4</option>\n<option value="kiukainen">Kiukainen</option>\n<option value="kiuruvesi">Kiuruvesi</option>\n<option value="kivijarvi">Kivij\xe4rvi</option>\n<option value="kokemaki">Kokem\xe4ki</option>\n<option value="kokkola">Kokkola</option>\n<option value="kolari">Kolari</option>\n<option value="konnevesi">Konnevesi</option>\n<option value="kontiolahti">Kontiolahti</option>\n<option value="korpilahti">Korpilahti</option>\n<option value="korppoo">Korppoo</option>\n<option value="korsnas">Korsn\xe4s</option>\n<option value="kortesjarvi">Kortesj\xe4rvi</option>\n<option value="koskitl">KoskiTl</option>\n<option value="kotka">Kotka</option>\n<option value="kouvola">Kouvola</option>\n<option value="kristiinankaupunki">Kristiinankaupunki</option>\n<option value="kruunupyy">Kruunupyy</option>\n<option value="kuhmalahti">Kuhmalahti</option>\n<option value="kuhmo">Kuhmo</option>\n<option value="kuhmoinen">Kuhmoinen</option>\n<option value="kumlinge">Kumlinge</option>\n<option value="kuopio">Kuopio</option>\n<option value="kuortane">Kuortane</option>\n<option value="kurikka">Kurikka</option>\n<option value="kuru">Kuru</option>\n<option value="kustavi">Kustavi</option>\n<option value="kuusamo">Kuusamo</option>\n<option value="kuusankoski">Kuusankoski</option>\n<option value="kuusjoki">Kuusjoki</option>\n<option value="kylmakoski">Kylm\xe4koski</option>\n<option value="kyyjarvi">Kyyj\xe4rvi</option>\n<option value="kalvia">K\xe4lvi\xe4</option>\n<option value="karkola">K\xe4rk\xf6l\xe4</option>\n<option value="karsamaki">K\xe4rs\xe4m\xe4ki</option>\n<option value="kokar">K\xf6kar</option>\n<option value="koylio">K\xf6yli\xf6</option>\n<option value="lahti">Lahti</option>\n<option value="laihia">Laihia</option>\n<option value="laitila">Laitila</option>\n<option value="lammi">Lammi</option>\n<option value="lapinjarvi">Lapinj\xe4rvi</option>\n<option value="lapinlahti">Lapinlahti</option>\n<option value="lappajarvi">Lappaj\xe4rvi</option>\n<option value="lappeenranta">Lappeenranta</option>\n<option value="lappi">Lappi</option>\n<option value="lapua">Lapua</option>\n<option value="laukaa">Laukaa</option>\n<option value="lavia">Lavia</option>\n<option value="lehtimaki">Lehtim\xe4ki</option>\n<option value="leivonmaki">Leivonm\xe4ki</option>\n<option value="lemi">Lemi</option>\n<option value="lemland">Lemland</option>\n<option value="lempaala">Lemp\xe4\xe4l\xe4</option>\n<option value="lemu">Lemu</option>\n<option value="leppavirta">Lepp\xe4virta</option>\n<option value="lestijarvi">Lestij\xe4rvi</option>\n<option value="lieksa">Lieksa</option>\n<option value="lieto">Lieto</option>\n<option value="liljendal">Liljendal</option>\n<option value="liminka">Liminka</option>\n<option value="liperi">Liperi</option>\n<option value="lohja">Lohja</option>\n<option value="lohtaja">Lohtaja</option>\n<option value="loimaa">Loimaa</option>\n<option value="loppi">Loppi</option>\n<option value="loviisa">Loviisa</option>\n<option value="luhanka">Luhanka</option>\n<option value="lumijoki">Lumijoki</option>\n<option value="lumparland">Lumparland</option>\n<option value="luoto">Luoto</option>\n<option value="luumaki">Luum\xe4ki</option>\n<option value="luvia">Luvia</option>\n<option value="maalahti">Maalahti</option>\n<option value="maaninka">Maaninka</option>\n<option value="maarianhamina">Maarianhamina</option>\n<option value="marttila">Marttila</option>\n<option value="masku">Masku</option>\n<option value="mellila">Mellil\xe4</option>\n<option value="merijarvi">Merij\xe4rvi</option>\n<option value="merikarvia">Merikarvia</option>\n<option value="merimasku">Merimasku</option>\n<option value="miehikkala">Miehikk\xe4l\xe4</option>\n<option value="mikkeli">Mikkeli</option>\n<option value="mouhijarvi">Mouhij\xe4rvi</option>\n<option value="muhos">Muhos</option>\n<option value="multia">Multia</option>\n<option value="muonio">Muonio</option>\n<option value="mustasaari">Mustasaari</option>\n<option value="muurame">Muurame</option>\n<option value="muurla">Muurla</option>\n<option value="mynamaki">Myn\xe4m\xe4ki</option>\n<option value="myrskyla">Myrskyl\xe4</option>\n<option value="mantsala">M\xe4nts\xe4l\xe4</option>\n<option value="mantta">M\xe4ntt\xe4</option>\n<option value="mantyharju">M\xe4ntyharju</option>\n<option value="naantali">Naantali</option>\n<option value="nakkila">Nakkila</option>\n<option value="nastola">Nastola</option>\n<option value="nauvo">Nauvo</option>\n<option value="nilsia">Nilsi\xe4</option>\n<option value="nivala">Nivala</option>\n<option value="nokia">Nokia</option>\n<option value="noormarkku">Noormarkku</option>\n<option value="nousiainen">Nousiainen</option>\n<option value="nummi-pusula">Nummi-Pusula</option>\n<option value="nurmes">Nurmes</option>\n<option value="nurmijarvi">Nurmij\xe4rvi</option>\n<option value="nurmo">Nurmo</option>\n<option value="narpio">N\xe4rpi\xf6</option>\n<option value="oravainen">Oravainen</option>\n<option value="orimattila">Orimattila</option>\n<option value="oripaa">Orip\xe4\xe4</option>\n<option value="orivesi">Orivesi</option>\n<option value="oulainen">Oulainen</option>\n<option value="oulu">Oulu</option>\n<option value="oulunsalo">Oulunsalo</option>\n<option value="outokumpu">Outokumpu</option>\n<option value="padasjoki">Padasjoki</option>\n<option value="paimio">Paimio</option>\n<option value="paltamo">Paltamo</option>\n<option value="parainen">Parainen</option>\n<option value="parikkala">Parikkala</option>\n<option value="parkano">Parkano</option>\n<option value="pedersore">Peders\xf6re</option>\n<option value="pelkosenniemi">Pelkosenniemi</option>\n<option value="pello">Pello</option>\n<option value="perho">Perho</option>\n<option value="pernaja">Pernaja</option>\n<option value="pernio">Perni\xf6</option>\n<option value="pertteli">Pertteli</option>\n<option value="pertunmaa">Pertunmaa</option>\n<option value="petajavesi">Pet\xe4j\xe4vesi</option>\n<option value="pieksamaki">Pieks\xe4m\xe4ki</option>\n<option value="pielavesi">Pielavesi</option>\n<option value="pietarsaari">Pietarsaari</option>\n<option value="pihtipudas">Pihtipudas</option>\n<option value="piikkio">Piikki\xf6</option>\n<option value="piippola">Piippola</option>\n<option value="pirkkala">Pirkkala</option>\n<option value="pohja">Pohja</option>\n<option value="polvijarvi">Polvij\xe4rvi</option>\n<option value="pomarkku">Pomarkku</option>\n<option value="pori">Pori</option>\n<option value="pornainen">Pornainen</option>\n<option value="porvoo">Porvoo</option>\n<option value="posio">Posio</option>\n<option value="pudasjarvi">Pudasj\xe4rvi</option>\n<option value="pukkila">Pukkila</option>\n<option value="pulkkila">Pulkkila</option>\n<option value="punkaharju">Punkaharju</option>\n<option value="punkalaidun">Punkalaidun</option>\n<option value="puolanka">Puolanka</option>\n<option value="puumala">Puumala</option>\n<option value="pyhtaa">Pyht\xe4\xe4</option>\n<option value="pyhajoki">Pyh\xe4joki</option>\n<option value="pyhajarvi">Pyh\xe4j\xe4rvi</option>\n<option value="pyhanta">Pyh\xe4nt\xe4</option>\n<option value="pyharanta">Pyh\xe4ranta</option>\n<option value="pyhaselka">Pyh\xe4selk\xe4</option>\n<option value="pylkonmaki">Pylk\xf6nm\xe4ki</option>\n<option value="palkane">P\xe4lk\xe4ne</option>\n<option value="poytya">P\xf6yty\xe4</option>\n<option value="raahe">Raahe</option>\n<option value="raisio">Raisio</option>\n<option value="rantasalmi">Rantasalmi</option>\n<option value="rantsila">Rantsila</option>\n<option value="ranua">Ranua</option>\n<option value="rauma">Rauma</option>\n<option value="rautalampi">Rautalampi</option>\n<option value="rautavaara">Rautavaara</option>\n<option value="rautjarvi">Rautj\xe4rvi</option>\n<option value="reisjarvi">Reisj\xe4rvi</option>\n<option value="renko">Renko</option>\n<option value="riihimaki">Riihim\xe4ki</option>\n<option value="ristiina">Ristiina</option>\n<option value="ristijarvi">Ristij\xe4rvi</option>\n<option value="rovaniemi">Rovaniemi</option>\n<option value="ruokolahti">Ruokolahti</option>\n<option value="ruotsinpyhtaa">Ruotsinpyht\xe4\xe4</option>\n<option value="ruovesi">Ruovesi</option>\n<option value="rusko">Rusko</option>\n<option value="rymattyla">Rym\xe4ttyl\xe4</option>\n<option value="raakkyla">R\xe4\xe4kkyl\xe4</option>\n<option value="saarijarvi">Saarij\xe4rvi</option>\n<option value="salla">Salla</option>\n<option value="salo">Salo</option>\n<option value="saltvik">Saltvik</option>\n<option value="sammatti">Sammatti</option>\n<option value="sauvo">Sauvo</option>\n<option value="savitaipale">Savitaipale</option>\n<option value="savonlinna">Savonlinna</option>\n<option value="savonranta">Savonranta</option>\n<option value="savukoski">Savukoski</option>\n<option value="seinajoki">Sein\xe4joki</option>\n<option value="sievi">Sievi</option>\n<option value="siikainen">Siikainen</option>\n<option value="siikajoki">Siikajoki</option>\n<option value="siilinjarvi">Siilinj\xe4rvi</option>\n<option value="simo">Simo</option>\n<option value="sipoo">Sipoo</option>\n<option value="siuntio">Siuntio</option>\n<option value="sodankyla">Sodankyl\xe4</option>\n<option value="soini">Soini</option>\n<option value="somero">Somero</option>\n<option value="sonkajarvi">Sonkaj\xe4rvi</option>\n<option value="sotkamo">Sotkamo</option>\n<option value="sottunga">Sottunga</option>\n<option value="sulkava">Sulkava</option>\n<option value="sund">Sund</option>\n<option value="suomenniemi">Suomenniemi</option>\n<option value="suomusjarvi">Suomusj\xe4rvi</option>\n<option value="suomussalmi">Suomussalmi</option>\n<option value="suonenjoki">Suonenjoki</option>\n<option value="sysma">Sysm\xe4</option>\n<option value="sakyla">S\xe4kyl\xe4</option>\n<option value="sarkisalo">S\xe4rkisalo</option>\n<option value="taipalsaari">Taipalsaari</option>\n<option value="taivalkoski">Taivalkoski</option>\n<option value="taivassalo">Taivassalo</option>\n<option value="tammela">Tammela</option>\n<option value="tammisaari">Tammisaari</option>\n<option value="tampere">Tampere</option>\n<option value="tarvasjoki">Tarvasjoki</option>\n<option value="tervo">Tervo</option>\n<option value="tervola">Tervola</option>\n<option value="teuva">Teuva</option>\n<option value="tohmajarvi">Tohmaj\xe4rvi</option>\n<option value="toholampi">Toholampi</option>\n<option value="toivakka">Toivakka</option>\n<option value="tornio">Tornio</option>\n<option value="turku" selected="selected">Turku</option>\n<option value="tuulos">Tuulos</option>\n<option value="tuusniemi">Tuusniemi</option>\n<option value="tuusula">Tuusula</option>\n<option value="tyrnava">Tyrn\xe4v\xe4</option>\n<option value="toysa">T\xf6ys\xe4</option>\n<option value="ullava">Ullava</option>\n<option value="ulvila">Ulvila</option>\n<option value="urjala">Urjala</option>\n<option value="utajarvi">Utaj\xe4rvi</option>\n<option value="utsjoki">Utsjoki</option>\n<option value="uurainen">Uurainen</option>\n<option value="uusikaarlepyy">Uusikaarlepyy</option>\n<option value="uusikaupunki">Uusikaupunki</option>\n<option value="vaala">Vaala</option>\n<option value="vaasa">Vaasa</option>\n<option value="vahto">Vahto</option>\n<option value="valkeakoski">Valkeakoski</option>\n<option value="valkeala">Valkeala</option>\n<option value="valtimo">Valtimo</option>\n<option value="vammala">Vammala</option>\n<option value="vampula">Vampula</option>\n<option value="vantaa">Vantaa</option>\n<option value="varkaus">Varkaus</option>\n<option value="varpaisjarvi">Varpaisj\xe4rvi</option>\n<option value="vehmaa">Vehmaa</option>\n<option value="velkua">Velkua</option>\n<option value="vesanto">Vesanto</option>\n<option value="vesilahti">Vesilahti</option>\n<option value="veteli">Veteli</option>\n<option value="vierema">Vierem\xe4</option>\n<option value="vihanti">Vihanti</option>\n<option value="vihti">Vihti</option>\n<option value="viitasaari">Viitasaari</option>\n<option value="vilppula">Vilppula</option>\n<option value="vimpeli">Vimpeli</option>\n<option value="virolahti">Virolahti</option>\n<option value="virrat">Virrat</option>\n<option value="vardo">V\xe5rd\xf6</option>\n<option value="vahakyro">V\xe4h\xe4kyr\xf6</option>\n<option value="vastanfjard">V\xe4stanfj\xe4rd</option>\n<option value="voyri-maksamaa">V\xf6yri-Maksamaa</option>\n<option value="yliharma">Ylih\xe4rm\xe4</option>\n<option value="yli-ii">Yli-Ii</option>\n<option value="ylikiiminki">Ylikiiminki</option>\n<option value="ylistaro">Ylistaro</option>\n<option value="ylitornio">Ylitornio</option>\n<option value="ylivieska">Ylivieska</option>\n<option value="ylamaa">Yl\xe4maa</option>\n<option value="ylane">Yl\xe4ne</option>\n<option value="ylojarvi">Yl\xf6j\xe4rvi</option>\n<option value="ypaja">Yp\xe4j\xe4</option>\n<option value="aetsa">\xc4ets\xe4</option>\n<option value="ahtari">\xc4ht\xe4ri</option>\n<option value="aanekoski">\xc4\xe4nekoski</option>\n</select>' 
     738u'<select name="municipalities">\n<option value="">---------</option>\n<option value="akaa">Akaa</option>\n<option value="alaharma">Alah\xe4rm\xe4</option>\n<option value="alajarvi">Alaj\xe4rvi</option>\n<option value="alastaro">Alastaro</option>\n<option value="alavieska">Alavieska</option>\n<option value="alavus">Alavus</option>\n<option value="anjalankoski">Anjalankoski</option>\n<option value="artjarvi">Artj\xe4rvi</option>\n<option value="asikkala">Asikkala</option>\n<option value="askainen">Askainen</option>\n<option value="askola">Askola</option>\n<option value="aura">Aura</option>\n<option value="brando">Br\xe4nd\xf6</option>\n<option value="dragsfjard">Dragsfj\xe4rd</option>\n<option value="eckero">Ecker\xf6</option>\n<option value="elimaki">Elim\xe4ki</option>\n<option value="eno">Eno</option>\n<option value="enonkoski">Enonkoski</option>\n<option value="enontekio">Enonteki\xf6</option>\n<option value="espoo">Espoo</option>\n<option value="eura">Eura</option>\n<option value="eurajoki">Eurajoki</option>\n<option value="evijarvi">Evij\xe4rvi</option>\n<option value="finstrom">Finstr\xf6m</option>\n<option value="forssa">Forssa</option>\n<option value="foglo">F\xf6gl\xf6</option>\n<option value="geta">Geta</option>\n<option value="haapajarvi">Haapaj\xe4rvi</option>\n<option value="haapavesi">Haapavesi</option>\n<option value="hailuoto">Hailuoto</option>\n<option value="halikko">Halikko</option>\n<option value="halsua">Halsua</option>\n<option value="hamina">Hamina</option>\n<option value="hammarland">Hammarland</option>\n<option value="hankasalmi">Hankasalmi</option>\n<option value="hanko">Hanko</option>\n<option value="harjavalta">Harjavalta</option>\n<option value="hartola">Hartola</option>\n<option value="hattula">Hattula</option>\n<option value="hauho">Hauho</option>\n<option value="haukipudas">Haukipudas</option>\n<option value="hausjarvi">Hausj\xe4rvi</option>\n<option value="heinola">Heinola</option>\n<option value="heinavesi">Hein\xe4vesi</option>\n<option value="helsinki">Helsinki</option>\n<option value="himanka">Himanka</option>\n<option value="hirvensalmi">Hirvensalmi</option>\n<option value="hollola">Hollola</option>\n<option value="honkajoki">Honkajoki</option>\n<option value="houtskari">Houtskari</option>\n<option value="huittinen">Huittinen</option>\n<option value="humppila">Humppila</option>\n<option value="hyrynsalmi">Hyrynsalmi</option>\n<option value="hyvinkaa">Hyvink\xe4\xe4</option>\n<option value="hameenkoski">H\xe4meenkoski</option>\n<option value="hameenkyro">H\xe4meenkyr\xf6</option>\n<option value="hameenlinna">H\xe4meenlinna</option>\n<option value="ii">Ii</option>\n<option value="iisalmi">Iisalmi</option>\n<option value="iitti">Iitti</option>\n<option value="ikaalinen">Ikaalinen</option>\n<option value="ilmajoki">Ilmajoki</option>\n<option value="ilomantsi">Ilomantsi</option>\n<option value="imatra">Imatra</option>\n<option value="inari">Inari</option>\n<option value="inio">Ini\xf6</option>\n<option value="inkoo">Inkoo</option>\n<option value="isojoki">Isojoki</option>\n<option value="isokyro">Isokyr\xf6</option>\n<option value="jaala">Jaala</option>\n<option value="jalasjarvi">Jalasj\xe4rvi</option>\n<option value="janakkala">Janakkala</option>\n<option value="joensuu">Joensuu</option>\n<option value="jokioinen">Jokioinen</option>\n<option value="jomala">Jomala</option>\n<option value="joroinen">Joroinen</option>\n<option value="joutsa">Joutsa</option>\n<option value="joutseno">Joutseno</option>\n<o