0

フィールド用の独自のカスタム ウィジェットを作成するために、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.
4

2 に答える 2

2

他のフィールドの値に応じて特定のフィールドを検証する場合は、フォームレベルで検証し、フィールドの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。したがって、この段階では、フォームは有効であると見なすことができます。

これらのメソッドは、一度に1つのフィールドで、上記の順序で実行されます。つまり、フォーム内の各フィールドに対して(フォーム定義で宣言されている順序で)、Field.clean()メソッド(またはそのオーバーライド)が実行され、次にclean_<fieldname>()。最後に、これら2つのメソッドがすべてのフィールドに対して実行されると、Form.clean()メソッドまたはそのオーバーライドが実行されます。

最終的なcleanメソッドは、エラーがあるかどうかに関係なく実際に実行されるため、エラーcleaned_dataがないことを確認するためにを繰り返す必要があります。

Formクラスまたはサブクラスのclean()メソッドは常に実行されます。そのメソッドでValidationErrorが発生した場合、cleaned_dataは空のディクショナリになります。

前の段落は、Form.clean()をオーバーライドする場合は、フォームの_errorsディクショナリ属性も考慮して、self.cleaned_data.items()を反復処理する必要があることを意味します。このようにして、どのフィールドが個々の検証要件に合格したかがすでにわかります。

于 2012-11-01T18:53:16.650 に答える
0

個々のフィールドの clean メソッドは、フォーム宣言の順序または明示的に指定された順序と同じ順序で呼び出されます。【ジャンゴソースコード

複数フィールドの検証に clean メソッドを使用するよりもこの方法をお勧めしませんが、カスタム フィールドが順序の最後のフィールドである場合、self._errors が他のすべてのフィールドが検証に合格したかどうかを示すことを期待できます。ただし、この段階では、フィールド以外のエラーは利用できません。

于 2012-11-01T19:10:56.467 に答える