52

有効な Django フォームがあれば、form.cleaned_data でデータにアクセスできます。しかし、フォームが有効でない場合、つまり form.is_valid が false の場合に、ユーザーが入力したデータを取得するにはどうすればよいですか。

フォーム セット内のフォームにアクセスしようとしているので、form.data が混乱しているようです。

4

7 に答える 7

52

使用できます

form.data['field_name']

このようにして、フィールドに割り当てられた生の値を取得します。

于 2009-09-17T18:36:49.980 に答える
17

http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validationを参照してください。

第 2 に、考慮している 2 つのフィールドの結合されたデータが無効であると判断したら、cleaned_data からそれらを削除することを忘れないでください。

実際、フォームにエラーがある場合、Django は現在、cleaned_data ディクショナリを完全に消去します。ただし、この動作は将来変更される可能性があるため、最初から自分でクリーンアップすることは悪い考えではありません。

元のデータは でいつでも利用できますrequest.POST


コメントは、より洗練されたフィールドレベルの検証のように聞こえる何かを行うことがポイントであることを示唆しています。

各フィールドには検証されていないデータが与えられ、有効なデータを返すか、例外を発生させます。

各フィールドでは、元のコンテンツに対してあらゆる種類の検証を実行できます。

于 2009-04-09T19:27:13.813 に答える
14

私は同様の問題に苦しんでおり、ここで素晴らしい議論に出くわしました: https://code.djangoproject.com/ticket/10427

十分に文書化されているわけではありませんが、ライブフォームの場合、ウィジェット/ユーザーから見たフィールドの値を次のように表示できます。

form_name['field_name'].value()
于 2012-06-12T22:51:06.123 に答える
5

次のパターンを使用できます。

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 を使用することは良い解決策ではありません。理由:

  • フォームに接頭辞がある場合、辞書キーにはこの接頭辞が付けられます。
  • form.data のデータは消去されません。文字列値のみがあります。
于 2011-05-27T12:17:15.893 に答える
4

フォームセットを使用して同様の問題が発生しました。私の例では、ユーザーに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')

お役に立てれば!

于 2012-03-21T14:57:22.477 に答える
1

フィールドの 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() が呼び出された後)。

于 2009-08-16T22:54:20.610 に答える