Python 从表单字段[Django]中检查表单是否有效

Python 从表单字段[Django]中检查表单是否有效,python,django,amazon-s3,django-forms,boto,Python,Django,Amazon S3,Django Forms,Boto,我在Django中对文本字段表单字段进行了子类化,以便为字段创建自己的自定义小部件。我想知道是否可以检查表单的所有其他字段是否有效(我希望其服务器端行为根据其他字段的验证而有所不同) 见评论 比如: class CustomField(TextInput): def __init__(self, *args, **kwargs): ... super(CustomField, self).__init__(*args, **kwargs) input_type = 'h

我在Django中对文本字段表单字段进行了子类化,以便为字段创建自己的自定义小部件。我想知道是否可以检查表单的所有其他字段是否有效(我希望其服务器端行为根据其他字段的验证而有所不同)

见评论

比如:

class CustomField(TextInput):
  def __init__(self, *args, **kwargs):
    ...
    super(CustomField, self).__init__(*args, **kwargs)

  input_type = 'hidden'

  def value_from_datadict(self, data, files, name):
    aws_file_key = data.get(name, None)
    _media_bucket = boto.connect_s3(settings.AWS_ACCESS_KEY_ID,
                                       settings.AWS_SECRET_ACCESS_KEY)\
                            .lookup(settings.AWS_MEDIA_STORAGE_BUCKET_NAME)

    try:
      key = _media_bucket.get_key(aws_file_key)
    except:
      print 'Failed to get key.'
      key = None

    if key and aws_file_key:
      fh = tempfile.TemporaryFile()
      key.get_contents_to_file(fh)
      fh.seek(0)
      files = SimpleUploadedFile(key.name, fh.read())
      ### IF FORM IS VALID DELETE KEY, OTHERWISE, KEEP IT.
      if code_to_check_if_valid:
        _media_bucket.delete_key(key)
      fh.close()
      return files
      ...... etc.

如果要根据其他字段的值验证某个字段,则需要在表单级别对其进行验证,并覆盖该字段的
clean
方法。-他们非常好

class CustomForm(forms.Form):
    custom_field = CustomField()

    def clean(self):
        cleaned_data = super(CustomForm, self).clean()
        custom_field = cleaned_data.get("custom_field")
        ...
,您将看到,如果所有其他字段都独立验证,则会运行
clean
方法,因此在此阶段,可以认为表单有效:

这些方法按照上面给出的顺序运行,一次运行一个字段。也就是说,对于表单中的每个字段(按照它们在表单定义中声明的顺序),运行
field.clean()
方法(或其重写),然后运行
clean()。最后,一旦对每个字段运行了这两个方法,就会执行
Form.clean()
方法或其重写

不管是否有错误,最终的clean方法实际上都会运行,因此您必须迭代
cleaned_数据
,以确保没有错误

表单类或子类的clean()方法始终运行。如果该方法引发ValidationError,则清除的_数据将是一个空字典

上一段的意思是,如果要覆盖Form.clean(),则应该遍历self.cleaned_data.items(),可能还需要考虑表单上的_errorsdictionary属性。这样,您就可以知道哪些字段已经通过了各自的验证要求


单个字段的clean方法的调用顺序与表单声明顺序或显式指定的顺序相同。[]

虽然我不推荐使用clean方法进行多字段验证,但如果自定义字段是订单中的最后一个字段,则可以使用self.\u错误指示是否所有其他字段都已通过验证。但是在这个阶段,非字段错误将不可用