2017-10-20 8 views
0

확인 :수정 값()와 나는 같은 것을 할 싶어 다시

class UsuarioForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(UsuarioForm, self).__init__(*args, **kwargs) 
     self.fields['cpf'].widget.attrs['maxlength'] = 14 
     self.fields['telefone'].widget.attrs['maxlength'] = 15 
     self.fields['celular'].widget.attrs['maxlength'] = 15 



    nome = forms.CharField(widget=forms.TextInput(attrs={'readonly': True, 
                 'icone': 'fa fa-font'})) 

    usuario = forms.CharField(widget=forms.TextInput(attrs={'readonly': True, 
                 'icone': 'fa fa-user'})) 



    def clean(self): 

     cleaned_data = self.cleaned_data 

     self.data['cpf'] = re.sub("[\.-]", "", self.data['cpf']) 

     clean_data_again_to_revalidate_the_field 


    class Meta: 
     model = Usuario 

     exclude = ['codigo', 'estabelecimento', 'dono', 'data', 'estabelecimento', 'cargo', 'usuario'] 


     widgets = { 

      'cpf': forms.TextInput(attrs={'placeholder': Text().cpf(), 
              'icone': 'fa fa-credit-card', 
              'id':'cpf', 

              }), 

      'telefone': forms.TextInput(attrs={'placeholder': Text().telefone(), 
               'icone': 'fa fa-phone'.decode('utf-8'), 
               'id': Text().telefone()}), 

      'celular': forms.TextInput(attrs={'placeholder': Text().celular(), 
               'icone': 'fa fa-mobile', 
               'id': Text().celular()}), 
     } 

가 나는 점을 제거하기 위해 필드 CPF를 변경하고 싶습니다. 그 후에 필드를 다시 확인하려고합니다. 가능한가?

또한 self.data [ 'cpf'] 값을 수신 할 수 없습니다. 이 QueryDict 인스턴스는 불변입니다.

clean_cpf 메소드를 만들었지 만 결코 호출되지 않습니다. 나는 cpf 필드가 cleaned_data에 나타나지 않기 때문에 데이터를받는 형식이 유효하지 않기 때문에 나는 생각한다.

또한 cpf는 cleaned_data에 없습니다. 나는 무효라고 생각합니다. cpf의 최대 길이는 11이지만 화면에서 오는 경우 필드의 길이는 14 자입니다. 이 때문에 필드를 변경하고 다시 유효성을 검사해야합니다.

+0

QueryDict 인스턴스가 다른 값으로 재 할당되기 전에 변경 될 때'self.data._mutable = True'를 시도한 다음 'self.data ['cpf '] = re.sub ("[\ .-] "," ", self.data [ 'cpf']). –

+0

@ArpitGoyal'QueryDict._mutable'은 보호 된 속성입니다. 당신이하고있는 것을 정말로 알지 못하는 한, 다른 감각적 인 해결책이 없습니다. 이 경우 변경 가능한 QueryDict를 얻기 위해 _documented_ 올바른 방법이 있습니다 : "변경 가능한 버전을 얻으려면 QueryDict.copy()"를 사용해야합니다. –

+0

@DiegoMartins : 연결된 질문으로 문제가 해결되지 않으면 설명을 게시하십시오 왜 - 어쩌면 당신은 사용자 정의 FormField 필요하거나 어쩌면 당신이 더 나은 정규 표현식과 일치하는 점으로 구분 된 값을 받아 들여야합니다 ... –

답변

1

& D 해킹이 직접 양식의 __init__data의 값을 수정하는 것입니다 A Q (주의 : 테스트되지 않은 코드) :

class UsuarioForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(UsuarioForm, self).__init__(*args, **kwargs) 
     if self.data: 
      # make the QueryDict mutable 
      self.data = self.data.copy() 
      # remove dots from data["cpf"] 
      if "cpf" in self.data: 
       self.data["cpf"] = self.data["cpf"].replace(".", "") 
     # ... 

그러나 당신은 여전히 ​​유효성 검사 오류를 얻을 경우, 양식을 다시 표시 할 때 " cpf "필드의 데이터는 도트가없는 렌더러가됩니다.

cpf 필드에 신용 카드 번호가 필요한 것으로 보이기 때문에 더 깨끗한 해결책은 맞춤 '신용 카드'입력란을 사용하는 것입니다. 몇 가지 세 번째 부분 구현이 웹에 있습니다.이 내용은 기본적으로 사용되거나 최소한 출발점을 제공합니다.

보조 노트 : 양식의 Meta에서 기본 위젯을 덮어 쓰고 양식의 __init__에서 동일한 필드의 "max_length"를 무시합니다. 이는 상당히 건조한 것은 아닙니다. Meta.widgets 부분에 직접 maxlength를 설정해야합니다.

+0

많은 감사합니다. 유효성 검사와 모델 양식이 작동하기 전에 CPF를 수정할 수있었습니다. 고마워. –