在django中实现USZipCodeField和USStateField

时间:2010-01-11 03:33:07

标签: python django django-models localization django-forms

我希望使用localflavor中的表单对象在django中实现一个zipcode字段,但并不能让它们正常工作。我希望在表单中有一个zipcode字段(或者在我的情况下是ModelForm),但是在表单对象上调用_get_errors()时,字段永远不会作为zipcode验证。我正在实施它的方式对我来说似乎是对的,但显然是错的,有谁知道这样做的正确方法是什么?

我有一个ModelForm我想在下面使用zipcode(以及USStateField):

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(),
                 }

ModelForm'FooForm'链接到一个看起来像的模型:

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...

但是,如果我创建表单的实例并运行它的验证,它从不关心表单级别验证,只关注模型级别验证:

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() 产率:

<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>

我需要能够在填充的表单对象上调用验证并让它告诉我,如果是这样,zipcode编码不正确。做错了什么,只是不知道什么是atm。

1 个答案:

答案 0 :(得分:1)

以声明方式使用widgets实际上只是在最后一天左右才添加到主干SVN版本中。如果您使用较旧的结帐或发布的版本,它将无法正常工作 - 您需要通过覆盖表单顶层的字段声明来回到旧的方式。