2011-03-02 25 views
4

新手到這一切!我正在顯示在前端顯示爲(xxx)xxx-xxxx的手機字段。以下是我的代碼。我的問題是1.所有字段是強制性的,由於某種原因,手機沒有表現爲expected.Even如果留空它不是抱怨和2.how我可以測試該插件的功能如何使用modelform和multiwidget

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不是真的。 任何輸入它非常appreciated.Thanks

回答

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「迴歸」路線將被改變。在這裏我接受它爲(xxx)-xxx-xxxx格式。在壓縮時按順序接收ph_0(areacode),ph_1(next 3),ph_2(last4)。但是我將它存儲爲xxxxxxxxxx。

Firebug幫助我更好地理解返回值應該是什麼。當我知道如何進行測試時,我會更新答案。

相關問題