2010-01-11 32 views
0

我正在寻找在django中使用来自localflavor的表单对象实现一个zipcode字段,但没有完全让他们工作。我想在表单中有一个zipcode字段(或者在我的例子中是ModelForm),但是在表单对象上调用_get_errors()时,字段永远不会验证为邮政编码。我实施它的方式对我来说似乎是正确的,但显然是错误的,是否有人知道正确的做法可能是什么?在django中实现USZipCodeField和USStateField

我有,我想使用邮编(也USStateField)一个的ModelForm:

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> 

我需要能够调用填充表单对象验证和有它告诉我,邮编是,如果这样不正确格式化。做错了什么,只是不知道什么是atm。

回答

1

使用widgets声明性地在字面上只是在最后一天左右才被添加到主干SVN版本。如果您使用的是旧版结帐或发布版本,则无法运行 - 您需要重新执行旧的结算方式,方法是覆盖表单顶层的字段声明。

+0

是的好赶,这几乎是这里发生了什么。我在1.1。当我浏览从谷歌进来的文件,它默认为开发文档,所以必须更加小心:P ... django开发团队的荣誉,以添加与该功能并行的文档权:) – Purrell 2010-01-11 19:03:47