如何使用modelform和multiwidget

时间:2011-03-02 17:40:58

标签: django django-forms django-multiwidget

所有这一切的新手!我正在显示前端显示为(xxx)xxx-xxxx的电话字段。下面是我的代码。我的问题是1.所有字段都是强制性的,出于某种原因,电话的行为并不像预期的那样。即使它留空也不抱怨,2。我可以测试这个小部件的功能

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

        def decompress(self, value):
            if value:
                val = value.split('-')
                return [val[0],val[1],val[2]]
            return [None,None,None]

        def compress(self, data_list):
            if data_list[0] and data_list[1] and data_list[2]:
                ph1 = self.check_value(data_list[0])
                ph2 = self.check_value(data_list[1])
                ph3 = self.check_value(data_list[2])
                return '%s''%s''%s' %(ph1,ph2,ph3)
            else:
                return None

        def check_value(self,val):
            try:
                if val.isdigit():
                    return val
            except:
                raise forms.ValidationError('This Field has to be a number!')

        def clean(self, value):
            try:
                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))
            except:
                raise ValidationError('Phone Number is required.')

        def value_from_datadict(self,data,files,name):
            val_list = [widget.value_from_datadict(data,files,name+'_%s' %i) for i,widget in enumerate(self.widgets)]
            try:
                return val_list
            except ValueError:
                return ''

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

    class CustomerForm(ModelForm):
    phone = forms.CharField(required=True,widget=USPhoneNumberWidget())
       class Meta:
            model = Customer
            fields = ('fname','lname','address1','address2','city','state','zipcode','phone')

在模型中,空白和null不正确。 任何输入它高度赞赏。谢谢

1 个答案:

答案 0 :(得分:0)

以下是电话字段:

phone = forms.CharField(label = 'Phone',widget=USPhoneNumberWidget() 
class USPhoneNumberWidget(forms.MultiWidget):
        """
        A widget that splits phone number into areacode/next3/last4 with textinput.
        """
        def __init__(self,attrs=None):
        widgets = (forms.TextInput(attrs={'size':'3','maxlength':'3'}),forms.TextInput(attrs={'size':'3','maxlength':'3'}),forms.TextInput(attrs={'size':'4','maxlength':'4'}))
        super(USPhoneNumberWidget,self).__init__(widgets,attrs=attrs)

    def decompress(self, value):
        if value:
            val = value
            return val[:3],val[3:6],val[6:]
        return None,None,None

    def compress(self, data_list):
        if data_list[0] and data_list[1] and data_list[2]:
            return '%s''%s''%s' %(data_list[0],data_list[1],data_list[2])
        else:
            return None

    def value_from_datadict(self,data,files,name):
        val_list = [widget.value_from_datadict(data,files,name+'_%s' %i) for i,widget in enumerate(self.widgets)]
        if val_list:
            return '%s''%s''%s' %(val_list[0],val_list[1],val_list[2])

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

但是,根据你在db'return'行中存储手机号码的方式,将被更改。在这里我接受它为(xxx)-xxx-xxxx格式。在压缩它按顺序接收ph_0(areacode),ph_1(接下来3),ph_2(last4)。但我将它存储为xxxxxxxxxx。

Firebug帮助我更好地了解返回值应该是什么。当我知道如何进行测试时,我会更新答案。