一般的なCreateView/UpdateViewでフォーム/モデルフィールドの検証がどこで行われるかについて少し混乱しています。以下の私の仮説モデルを考えてみましょう。カスタムハッシュ関数を使用してフィールドsecret
をハッシュして保存し、secret
フィールドの検証が行われたと仮定します(以下の例には示されていません)。これを行うための私のオプションは次のとおりです。
1)モデルの保存方法(以下では示していません)
2)フォームの保存方法(以下に示しました)
3)のform_valid
方法でAccountCreateView
(私は以下に示しました)
4) 一般的なビューでcleaned_dataにアクセスするにはどうすればよいですか (cleaned_data
が呼び出された後にのみ利用可能ですform_valid
)
これは、長所と短所の両方で、それを行う正しい方法です。に同じフォームを使用します。updateView
この場合、シークレットのデータをフォームに表示する前にハッシュを解除します。これはどこで起こるべきですか?
私のモデル:
class Account(models.Model):
user = models.ForeignKey(User)
created = models.DateField(auto_now=True)
secret = models.IntegerField()
私のフォーム:
AccountCreateForm(forms.ModelForm):
secret = forms.CharField(max_length=100)
class Meta:
model = MediaContent
exclude = (secret,user,created)
def save(self, user, debate):
obj = super(AccountCreateView, self).save(commit=False)
obj.user = self.cleaned_data['user']
obj.secret = myHashfunction(self.cleaned_data['secret'])
obj.save()
私の見解:
class AccountCreateView(CreateView):
"""
displays form to create a new search
"""
model = Account
form_class = AccountCreateForm
success_url = reverse_lazy('home')
template_name = 'app/account_form.html'
def form_valid(self, form):
f = form.save(commit=False)
secret=myHashfunction(self.request.POST['secret'])
f.user = self.request.user
f.save()
return super(AccountCreateView,self).form_valid(form)
編集:
モデルとフォームの編集を参照してください。フォームで使用するフィールドは、モデルのフィールドではありません。これは、CharField を受け取る新しい Field ですが、モデルは IntegerField として保存されます。私の hashfunciton は charField を IntegerField に変換します。