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

时间:2012-11-01 18:49:32

标签: python django amazon-s3 django-forms boto

我已经在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.

2 个答案:

答案 0 :(得分:2)

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

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

    def clean(self):
        cleaned_data = super(CustomForm, self).clean()
        custom_field = cleaned_data.get("custom_field")
        ...

If you look at the flow of how forms are validated,如果所有其他字段独立验证,您将看到 clean方法已运行,因此在此阶段,表单可被视为有效: < / p>

  

这些方法按上面给出的顺序运行,一次一个字段。也就是说,对于表单中的每个字段(按照表单定义中声明的顺序),运行Field.clean()方法(或其覆盖),然后运行clean_<fieldname>()。最后,一旦为每个字段运行这两个方法,就会执行Form.clean()方法或其覆盖。

无论是否存在错误,最终的清理方法都会运行,因此您必须遍历cleaned_data以确保没有错误

  

始终运行Form类或子类的clean()方法。如果该方法引发ValidationError,则cleaning_data将是一个空字典。

     

前一段意味着如果你重写了Form.clean(),你应该遍历self.cleaned_data.items(),也可能考虑表单上的_errors字典属性。通过这种方式,您将已经知道哪些字段已通过其各自的验证要求。

答案 1 :(得分:0)

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

虽然我不建议使用此方法而不是使用clean方法进行多字段验证,但如果您的自定义字段是订单中的最后一个字段,则可以指望self._errors指示是否所有其他字段都已通过验证或不。但是,在此阶段,将无法获得非字段错误。