条件验证取决于 POST 参数 Django



我有一个表单,我正在尝试对它进行一些"条件"验证,具体取决于用户单击的按钮。

如果用户单击"提交",则这些字段

应全部为必填字段,如果用户单击"草稿",则不应必填任何字段。

我的模型指定不需要任何字段来容纳草稿。然后我试图覆盖它以仅在单击某个按钮时才要求验证,但我一辈子都不知道该怎么做。

我简化了下面的代码。

形式:

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

最新更新