2017-06-18 7 views
1

私は実際にこれを理解するのに苦労しています。下の問題は、パスワードフィールドの初期値を設定するか、メソッドvalidate_memberが呼び出される方法をオーバーライドする必要があることです。物事を保つために)(子/継承フォームの親djangoフォームのclean()メソッドのオーバーライド

class NewMemberForm(forms.Form): 
    ''' 
    Called when user wants to register with our system from web/mobile. Ask password here 

    ''' 

    firstName=forms.CharField(max_length=25,required=True,widget=forms.TextInput()) 
    lastName=forms.CharField(max_length=25,required=True,widget=forms.TextInput()) 
    birthdate=forms.DateField(required=True) 
    gender=forms.ChoiceField(choices=Profile.GENDER,required=True) 
    idnumber=forms.CharField(required=False,max_length=25) 
    phone=forms.IntegerField(required=True) 
    email=forms.EmailField(required=True) 
    password=forms.CharField(max_length=16,widget=forms.PasswordInput()) 
    memberType=forms.ChoiceField(choices=Profile.TYPE_OF_MEMBER,widget=forms.Select()) 
    maritalStatus=forms.ChoiceField(choices=Profile.MARITAL_STATUS,widget=forms.Select()) 



    def clean(self): 
     ''' 
     Grouped cleaning 
     ''' 
     self.cleaned_data=super(NewMemberForm,self).clean() 

     validate_member_form=validate_member(self.cleaned_data,False) 

     #do we have error messages now? 

     if len(validate_member_form[0])>0: #yes we have error messages 
      raise forms.ValidationError(_(validate_member_form[0]),code='invalid') 

     return validate_member_form[1] 

validate_member機能は情報を編集し、追加時に使用され、これきれいに掃除:私はメンバーが直接システムに登録する必要があるときに呼び出され、このフォームは、持っている

ドライ。今、別のメンバーが(ある権利を持って)登録できるシナリオがあります。その場合、passwordという名前のフォームに1つの新しいフィールドが追加されているため、passwordフィールドとmembertypeフィールドは必要ありません。私は、フォームを継承することを決めた:私は完全に無視され、子クラスでクリーン()メソッドに気づいた、今

class MemberAddForm(NewMemberForm): 

    #memberType=forms.CharField(initial='Individual',required=False,widget=forms.Select()) #iignored: here to simple override the Required declaraton in memberform 
    #password=forms.CharField(max_length=16,widget=forms.PasswordInput(),required=False,initial='111111') #note pwd is ignored during saving and a new is generated 
    role=forms.ModelChoiceField(widget=forms.Select(),required=True,queryset=Activity.objects.filter(active='Active').only('id','name'),empty_label=None) 

    def __init__(self,*args,**kwargs): 
     super(MemberAddForm,self).__init__(*args,**kwargs) 
     self.fields['password'].initial='123456' #note this is meangingless and in place to pass validate_member 
     self.fields['password'].required=False 
     self.fields['memberType'].initial='Individual' 
     self.fields['memberType'].required=False 

    def clean(self): 
     ''' 
     This is not been used at all. 
     ''' 

     self.cleaned_data=super(MemberAddForm,self).clean() 
     self.cleaned_data['password']='!983.kIl' 


     #validate_member_form=validate_member(self.cleaned_data,False,False) 

     #do we have error messages now? 

     if len(validate_member_form[0])>0: #yes we have error messages 
      raise forms.ValidationError(_(validate_member_form[0]),code='invalid') 

をし、検証がparent.cleanからの世話をされている()のみ。 validate_memberメソッドで3番目のパラメータをFalseにする必要があります(これはParentクラスでTrueです)。 validate_memberは、パスワードの複雑さと内容をチェックします。 required = Falseを設定すると、「このフィールドは必須です」というエラーが表示されなくなるため、部分的に役立ちます。ただし、パスワードはまだ複雑さがチェックされています。ご覧のとおり、私はパスワード設定を渡す初期値にパスワードを設定しますが、私が何をしてもエラーが発生します。

答えて

0

子クラスでこの行はその親のcleanメソッドが呼び出される原因になっている:2として

self.cleaned_data=super(MemberAddForm,self).clean() 

はほぼ同じで、それは子供の一つはすなわち、親のcleanが正常にも合格した場合、呼び出されないように見えます子供のものはそうするでしょう。あなたの問題のため

ソリューションに括弧のclean方法を変更するために、次のようになります。

def clean(self, validate_member=True): 
     ''' 
     Grouped cleaning 
     ''' 
     self.cleaned_data=super(NewMemberForm,self).clean() 

     if validate_member: 
      validate_member_form=validate_member(self.cleaned_data, False) 

     # Do we have error messages now? 
     if len(validate_member_form[0]) > 0: # yes we have error messages 
      raise forms.ValidationError(_(validate_member_form[0]), code='invalid') 

     return validate_member_form[1] 

そして、あなたが子供のclean方法にしなければならないすべては、次のとおりです。

def clean(self): 
    return super(NewMemberForm,self).clean(validate_member=False) 
+0

申し訳ありません申し訳ありませんが、私はあなたのコメントを回答として間違ってマークしました。しかし、私はclean()メソッドが引数を受け入れるかどうか分からないのですか?それとも、それは完全で清潔ではありませんでしたか?私はしてみてください。 –

+0

余分な引数を定義してもかまいません(親クリーン関数で)、標準のDjangoの方法で呼び出せるように、デフォルト値を必ず設定してください。 –

1

別のオプションがあります

# dynamic form creation 
class CreateUpdateView(FormView): 
    template_name = 'apps/frontend/create_update_view.j2' 
    def get_form_class(self): 
     # url like: /user/(?P<mode>[^/]+)/ - /user/register/ or /user/update/ 
     is_password_required = self.kwargs.get('mode') == 'register' 

     class _Form(forms.Form): 
      if is_password_required: 
       password = forms.CharField(widget=forms.PasswordInput) 

      first_name = forms.CharField(max_length=25, required=True) 

     return _Form 
+0

それは動作しますが、Domenのソリューションは現在実行中のアプリケーションに簡単にマージできると思います。私は全く考えていない代替ソリューションのためのVadimchinに感謝します。 –

+0

ようこそ) – vadimchin

関連する問題