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,但模型保存为 IntegerField。我的 hashfunciton 会将 charField 转换为 IntegerField。

4

2 回答 2

1

我认为在这种情况下Form比 更好ModelForm,因为排除模型上的每个字段都会使其变得多余。然后,您应该secret在此处使用clean_secret.

AccountCreateForm(forms.Form):
    secret=forms.CharField(max_length=100)

现在,如果您不再使用 the ModelForm,我建议您使用FormViewover CreateView,因为泛型CreateView已变得不太合适。

class AccountCreateView(FormView):
    """
    displays form to create a new search
    """
    form_class = AccountCreateForm
    success_url = reverse_lazy('home')
    template_name = 'app/account_form.html'

    def form_valid(self, form):
        unhashed_secret = form.cleaned_data['secret']
        hashed_secret = myHashfunction(unhashed_secret)
        user = self.request.user

        # Probably put some extra logic here to check if the user already exists
        Account.objects.create(
            user=user,
            secret=hashed_secret,
        )

        return super(AccountCreateView,self).form_valid(form)
于 2014-04-21T21:33:11.790 回答
0

以上都不是。执行此操作的正确位置是在clean_secret表单的方法中。这是任何与字段相关的验证和转换的地方。只需从该方法返回散列值。

于 2014-04-21T20:03:07.293 回答