在Django中实现USZipCodeField和USStateField

0 投票
1 回答
1556 浏览
提问于 2025-04-15 17:52

我想在Django中实现一个邮政编码字段,使用来自localflavor的表单对象,但我一直搞不定。我想在一个表单(在我的情况下是ModelForm)中添加一个邮政编码字段,但当我在表单对象上调用_get_errors()时,这个字段从来没有被验证为有效的邮政编码。我觉得我实现的方式是对的,但显然是错的,有人知道正确的方法是什么吗?

我有一个ModelForm,我想在里面使用邮政编码(还有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>

我需要能够在填充后的表单对象上调用验证,并且如果邮政编码格式不正确,它能告诉我。现在我觉得做错了什么,但不知道具体是什么。

1 个回答

1

最近刚刚在主版本中添加了可以声明式使用widgets的功能。如果你使用的是较旧的版本或者已经发布的版本,这个新功能是无法使用的。你需要回到以前的做法,也就是在表单的最上面重新定义字段。

撰写回答