开发者

Implementing USZipCodeField and USStateField in django

I'm looking to implement a zipcode field in django using the form objects from localflavor, but not quite getting them to work. I want to have a zipcode field in a form (or ModelForm in my case), but the fields never validate as a zipcode when calling _get_errors() on the form object. The way I'm implementing it seems right to me but is apparently wrong, does anyone know what the right way to do this might be?

I have a ModelForm that I want to use zipcode (and also USStateField) in:

from django.contrib.localflavor.us.forms import USStateField
from django.contrib.localflavor.us.forms import USZipCodeField

class FooForm(ModelForm):
    class Meta:
        model  = Bar
        fields = ('address', #This form uses a subset of fields from the model
                  'address_apt',
                  'address_city',
                  'address_state',
                  'address_zip',
                  'home_phone',
                  'mobile_phone')
        widgets= {
                  'address_zip'    : USZipCodeField(),
                  'address_state'  : USStateField(),
                 }

The ModelForm 'FooForm' links to a model that looks like:

from django.contrib.localflavor.us import models as usmodels

class Bar(models.Model):
    db_table = 'BAR'

    address                 = models.CharField(max_length=255)
    address_apt             = models.CharField(max_length=40, blank=True)
    address_city            = models.CharField(max_length=90)
    address_state           = usmodels.USStateField()
    address_zip             = models.CharField(max_length=15)
    home_phone              = usmodels.PhoneNumberField( )
    mobile_phone            = usmodels.PhoneNumberField( )
    #... There are more fields in the model...

But if I create an instance of the form and run it's validation, it never cares about the form level validation, only the model level validation:

foo_instance = FooForm(request.POST)
#Let's assume request.POST looks like: 
#<QueryDict: {u'address_city': [u'asdf'], u'mobile_phone': [u'asdf'], u'address_state': [u'California'], u'home_phone': [u'asdf'], [u'1'], u'address': [u'123 foo'], u'address_zip': [u'asdf']}>

foo_instance._get_errors() Yields:

<ul class="errorlist">
<li>mobile_phone<ul class="errorlist">
<li>Phone numbers must be in XXX-XXX-XXXX format.</li></ul>
</li><li>home_phone<ul class="errorlist">
<li>Phone numbers must be in XXX-XXX-XXXX format.</li></ul>
</li></ul>

I need to be able to call validation on the populated form object and have it tell me 开发者_Python百科that the zipcode is formated improperly if so. Doing something wrong, just don't know what atm.


Using widgets declaratively has literally only just been added to the trunk SVN version in the last day or so. If you're using an older checkout, or a released version, it won't work - you'll need to go back to the old way of doing it, by overriding the field declarations at the top level of the form.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜