Django MultiWidget电话号码字段 [英] Django MultiWidget Phone Number Field

查看:1078
本文介绍了Django MultiWidget电话号码字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个具有2个文本字段(分别为3,3和4)与通用() - 分隔符的电话号码输入的字段。以下是我的字段和小部件的代码,当我在初始化渲染期间尝试迭代窗体中的字段时,会收到以下错误(当for循环到达我的电话号码字段时):



在呈现时捕获异常:'NoneType'对象是不可替代的

  class PhoneNumberWidget 
$ b $ w =(forms.TextInput(attrs = {'size':'3','maxlength':'3'}),
def __init __(self,attrs = \
forms.TextInput(attrs = {'size':'3','maxlength':'3'}),\
forms.TextInput(attrs = {'size':'4 ','maxlength':'4'}))
super(PhoneNumberWidget,self).__ init __(假发,attrs)

def解压缩(self,value):
return值或无

def format_output(self,rendered_widgets):
return'('+ rendered_widgets [0] +')'+ rendered_widgets [1] +' - '+ rendered_wid获取[2]

class PhoneNumberField(forms.MultiValueField):
widget = PhoneNumberWidget
def __init __(self,* args,** kwargs):
fields = (forms.CharField(max_length = 3),forms.CharField(max_length = 3),forms.CharField(max_length = 4))
super(PhoneNumberField,self).__ init __(fields,* args,** kwargs)
def compress(self,data_list):
如果fields_EMPTY_VALUES或data_list [1]在fields.EMPTY_VALUES或data_list [2]中的fields_EMPTY_VALUES中的data_list [0]:
raise fields $ V


$ b class AdvertiserSumbissionForm(ModelForm):
business_phone_number = PhoneNumberField(required = True)


解决方案

我采取了hughdbrown的建议和修改后的USPhoneNumberField来做我所需要的。最初没有使用它的原因是它将电话号码作为XXX-XXX-XXXX存储在数据库中,我将它们存储为XXXXXXXXXX。所以我超越了干净的方法:

  class PhoneNumberField(USPhoneNumberField):
def clean(self,value) :
super(USPhoneNumberField,self).clean(value)
如果值在EMPTY_VALUES中:
return u'
value = re.sub('(\(| $)$,$$$$$$$$$$ (m.group(1),m.group(2),m.group(3))
raise ValidationError(self.error_messages ['invalid'])
/ pre>

I want to create a field for phone number input that has 2 text fields (size 3, 3, and 4 respectively) with the common "(" ")" "-" delimiters. Below is my code for the field and the widget, I'm getting the following error when trying to iterate the fields in my form during initial rendering (it happens when the for loop gets to my phone number field):

Caught an exception while rendering: 'NoneType' object is unsubscriptable

class PhoneNumberWidget(forms.MultiWidget):
    def __init__(self,attrs=None):
        wigs = (forms.TextInput(attrs={'size':'3','maxlength':'3'}),\
                forms.TextInput(attrs={'size':'3','maxlength':'3'}),\
                forms.TextInput(attrs={'size':'4','maxlength':'4'}))
        super(PhoneNumberWidget, self).__init__(wigs, attrs)

    def decompress(self, value):
        return value or None

    def format_output(self, rendered_widgets):
        return '('+rendered_widgets[0]+')'+rendered_widgets[1]+'-'+rendered_widgets[2]

class PhoneNumberField(forms.MultiValueField):
    widget = PhoneNumberWidget
    def __init__(self, *args, **kwargs):
        fields=(forms.CharField(max_length=3), forms.CharField(max_length=3), forms.CharField(max_length=4))
        super(PhoneNumberField, self).__init__(fields, *args, **kwargs)
    def compress(self, data_list):
        if data_list[0] in fields.EMPTY_VALUES or data_list[1] in fields.EMPTY_VALUES or data_list[2] in fields.EMPTY_VALUES:
            raise fields.ValidateError(u'Enter valid phone number')
        return data_list[0]+data_list[1]+data_list[2]

class AdvertiserSumbissionForm(ModelForm):
    business_phone_number = PhoneNumberField(required=True)

解决方案

I took hughdbrown's advise and modified USPhoneNumberField to do what I need. The reason I didn't use it initially was that it stores phone numbers as XXX-XXX-XXXX in the DB, I store them as XXXXXXXXXX. So I over-rode the clean method:

class PhoneNumberField(USPhoneNumberField):
    def clean(self, value):
        super(USPhoneNumberField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''
        value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
        m = phone_digits_re.search(value)
        if m:
            return u'%s%s%s' % (m.group(1), m.group(2), m.group(3))
        raise ValidationError(self.error_messages['invalid'])

这篇关于Django MultiWidget电话号码字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆