2

一般的な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 に変換します。

4

2 に答える 2

0

上記のどれでもない。これを行う正しい場所clean_secretは、フォームのメソッドです。これは、フィールド関連の検証と変換の場所です。そのメソッドからハッシュ値を返すだけです。

于 2014-04-21T20:03:07.293 に答える