我有一个表单,我正在尝试对它进行一些"条件"验证,具体取决于用户单击的按钮。
如果用户单击"提交",则这些字段应全部为必填字段,如果用户单击"草稿",则不应必填任何字段。
我的模型指定不需要任何字段来容纳草稿。然后我试图覆盖它以仅在单击某个按钮时才要求验证,但我一辈子都不知道该怎么做。
我简化了下面的代码。
形式:
class MOCForm(forms.ModelForm):
facility = forms.CharField(required=False)
def fields_required(self, fields):
"""Used for conditionally marking fields as required."""
for field in fields:
if not self.cleaned_data.get(field, ''):
msg = forms.ValidationError(" This field is required.")
self.add_error(field, msg)
def clean(self):
self.fields_required(['facility'])
return self.cleaned_data
查看方法:
def post(self, request):
if request.POST.get('_start') == '' or request.POST.get('_draft') == '':
MOC_form = forms.MOCForm(request.POST, prefix="MOC_form", instance=MOC)
if request.POST.get('_draft') == '' or MOC_form.is_valid():
MOC_form.save()
if request.POST.get('_start') == '':
MOC.submitted_date = timezone.now()
if request.POST.get('_draft') == '':
MOC.status = C.moc_status_draft()
if request.POST.get('_start') == '' or request.POST.get('_draft') == '':
MOC.creator = request.user
MOC.save()
if request.POST.get('_start') == '' or request.POST.get('_draft') == '':
# If there is an activation (i.e. it is part of the flow), redirect appropriately
if request.activation:
request.activation.process.MOC = MOC
request.activation.done()
return redirect(get_next_task_url(request, request.activation.process))
# Otherwise, just reload the same page (likely the dashboard)
else:
return redirect(request.path)
else:
if request.POST.get('_start') == '' or request.POST.get('_draft') == '':
context = {}
return render(request, 'MOC/CreateMOC.html', context)
问题是,即使我完全取出MOC_form.is_valid()
支票,它仍然给我同样的错误:The MOC could not be changed because the data didn't validate.
我想完全跳过此验证,但前提是 POST 参数包含提交的"_draft" - 但我无法访问 clean 方法中的 POST 参数。我该怎么做?
谢谢!
但我无法访问干净方法中的 POST 参数
您确实具有访问权限,因为您将 POST 数据作为 MOCForm.__init__
的data
属性传递。
所以你可以这样做:
class MOCForm(forms.ModelForm):
# your class definition as above
def clean(self):
if '_draft' in self.data:
# skip check
else:
# clean data