私は実際にこれを理解するのに苦労しています。下の問題は、パスワードフィールドの初期値を設定するか、メソッド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を設定すると、「このフィールドは必須です」というエラーが表示されなくなるため、部分的に役立ちます。ただし、パスワードはまだ複雑さがチェックされています。ご覧のとおり、私はパスワード設定を渡す初期値にパスワードを設定しますが、私が何をしてもエラーが発生します。
申し訳ありません申し訳ありませんが、私はあなたのコメントを回答として間違ってマークしました。しかし、私はclean()メソッドが引数を受け入れるかどうか分からないのですか?それとも、それは完全で清潔ではありませんでしたか?私はしてみてください。 –
余分な引数を定義してもかまいません(親クリーン関数で)、標準のDjangoの方法で呼び出せるように、デフォルト値を必ず設定してください。 –