我对在通用 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。