views:

94

answers:

1

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 that the zipcode is formated improperly if so. Doing something wrong, just don't know what atm.

+1  A: 

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.

Daniel Roseman
Yeah good catch, that's pretty much what's going on here. I'm on 1.1. When I browse the the documentation coming in from google it defaults to the development docs so have to be more careful :P ... Kudos to the django dev team for adding the documation right in parallel with the feature :)
perrierism