如何解决如何从表单验证中排除字段但保存已清理的数据
编辑:我不是在问如何避免模型字段被验证。我知道为什么要这么做。我问的是,当我覆盖表单的clean()方法时,如何才能仅跳过我编写的检查。我希望cleaned_data不能通过我编写的其他验证。
比方说,我有一个ModelForm,带有“保存”和“存档”选项(即稍后保存),这些选项仅在单击后才会显示在post_data中。如果用户单击“保存”,则表单将像通常一样通过所有验证(包括form.clean()中的一些自定义逻辑)。如果用户单击“存档”,则不会运行form.clean()中的任何自定义验证,而应保存数据。
在forms.py中,我尝试将form.clean()方法定义为如下形式:
def clean(self,full_clean=True):
cleaned_data = super().clean()
if full_clean:
# All my validation
...
...
return cleaned_data
然后在我的views.py中:
...
...
if request.method == "POST":
post_data = request.POST
if post_data.get('save') != None: # Do all validation
if form.is_valid():
form.save()
cleaned_form = form.cleaned_data
...
...
else: # If not valid
# Do something with the errors
...
elif post_data.get('archive') != None: # Don't do any validation
form.is_valid()
cleaned_form = form.clean(full_clean=False)
...
...
form.save()
...
问题是,在调用form.is_valid()时会调用form.clean()方法,因此所有自定义验证仍将执行。我还尝试将full_clean
的默认值设置为False
,但是当我想要时,它将无法正确验证。如果删除第二个form.is_valid()
调用,将不会创建cleaned_data并引发错误。任何建议将不胜感激。
解决方法
覆盖init()并根据post_data
设置一个新字段。
def __init__(self,*args,**kwargs):
archived = kwargs.pop('archived',None)
super(MyForm,self).__init__(*args,**kwargs)
self.fields['archived'] = forms.BooleanField(initial=archived,required=False)
然后实际添加到您的表单
form = MyForm(request.post,archived=post_data.get('archived'))
在自定义clean()方法中,检查一下self.fields.get('archived')。
def clean(self):
if not self.fields.get('archived']:
# Do your validation
否则,它只会跳过自定义验证。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。