有効な Django フォームがあれば、form.cleaned_data でデータにアクセスできます。しかし、フォームが有効でない場合、つまり form.is_valid が false の場合に、ユーザーが入力したデータを取得するにはどうすればよいですか。
フォーム セット内のフォームにアクセスしようとしているので、form.data が混乱しているようです。
有効な Django フォームがあれば、form.cleaned_data でデータにアクセスできます。しかし、フォームが有効でない場合、つまり form.is_valid が false の場合に、ユーザーが入力したデータを取得するにはどうすればよいですか。
フォーム セット内のフォームにアクセスしようとしているので、form.data が混乱しているようです。
使用できます
form.data['field_name']
このようにして、フィールドに割り当てられた生の値を取得します。
http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validationを参照してください。
第 2 に、考慮している 2 つのフィールドの結合されたデータが無効であると判断したら、cleaned_data からそれらを削除することを忘れないでください。
実際、フォームにエラーがある場合、Django は現在、cleaned_data ディクショナリを完全に消去します。ただし、この動作は将来変更される可能性があるため、最初から自分でクリーンアップすることは悪い考えではありません。
元のデータは でいつでも利用できますrequest.POST
。
コメントは、より洗練されたフィールドレベルの検証のように聞こえる何かを行うことがポイントであることを示唆しています。
各フィールドには検証されていないデータが与えられ、有効なデータを返すか、例外を発生させます。
各フィールドでは、元のコンテンツに対してあらゆる種類の検証を実行できます。
私は同様の問題に苦しんでおり、ここで素晴らしい議論に出くわしました: https://code.djangoproject.com/ticket/10427
十分に文書化されているわけではありませんが、ライブフォームの場合、ウィジェット/ユーザーから見たフィールドの値を次のように表示できます。
form_name['field_name'].value()
次のパターンを使用できます。
class MyForm(forms.Form):
...
def clean(self):
self.saved_data=self.cleaned_data
return self.cleaned_data
あなたのコードで:
if form.is_valid():
form.save()
return django.http.HttpResponseRedirect(...)
if form.is_bound:
form.saved_data['....'] # cleaned_data does not exist any more, but saved_data does.
form.data を使用することは良い解決策ではありません。理由:
フォームセットを使用して同様の問題が発生しました。私の例では、ユーザーに2番目の選択肢の前に1番目の選択肢を選択してもらいたいのですが、1番目の選択肢が別のエラーにヒットした場合、「2番目の選択肢の前に1番目の選択肢を選択」エラーも表示されました。
1番目のフィールドの未クリーンなデータを取得するために、フォームフィールドのクリーンメソッド内でこれを使用しました。
dirty_rc1 = self.data[self.prefix + '-reg_choice_1']
次に、そのフィールドにデータが存在するかどうかをテストできます。
if not dirty_rc1:
raise ValidationError('Make a first choice before second')
お役に立てれば!
フィールドの clean() メソッドまたはフォームの clean() メソッドからデータにアクセスします。clean() は、フォームが有効かどうかを判断する関数です。is_valid() が呼び出されたときに呼び出されます。フォームの clean() には、cleaned_data
カスタム コードを実行してすべてがチェックアウトされていることを確認できるリストがあります。ウィジェットには clean() もありますが、渡された単一の変数を使用します。フィールドの clean() メソッドにアクセスするには、サブクラス化する必要があります。例えば:
class BlankIntField(forms.IntegerField):
def clean(self, value):
if not value:
value = 0
return int(value)
たとえば、空の値でチョークしない IntField が必要な場合は、上記を使用します。
フォーム上の clean() は、次のように機能します。
def clean(self):
if self.cleaned_data.get('total',-1) <= 0.0:
raise forms.ValidationError("'Total must be positive")
return self.cleaned_data
また、各フィールドに clean_FIELD() 関数を使用して、各フィールドを個別に検証できるようにすることもできます (フィールドの clean() が呼び出された後)。