0

POST リクエストを処理し、新しいオブジェクトを作成しようとするビューがあります。ただし、POST されたデータの一部が無効であることはわかっています...しかし、それを修正して先に進み、オブジェクトを作成したいと考えています。

ModelForm でデータを「修正」できる唯一の方法は、「is_valid()」フォームを作成することです。これを行うには、POST データを使用してフォームを作成するか、既存のインスタンスを使用してフォームを作成します。残念ながら、POST データを使用すると、その一部が無効であるため、フォームが検証されず、フォーム内のデータにアクセスして修正することができません。既存のインスタンスで作成した場合、これは機能しますが、フォームが表示されると、何らかの理由で残りのエラーは無視されます (したがって、Web ページには表示されません)。 POST データからモデル フォームを取得し、インスタンスを提供しますが、これは役に立たないようです。さらに、POST データを変更 (のコピー) して修正し、「POST データを修正しました。この種の作品は、私のフォームに ImageFields がいくつかあることを除いて、無視されているようです。

どんな助けでも大歓迎です。私は無駄に見つけることができるすべての良いページを見てきました.

おそらくこれを行うためのより良い方法がありますか?私が解決しようとしている問題は、ImageFields を含むモデルが必要だということです。初めてフォームを作成するとき、ユーザーは各フィールドの画像を「アップロード」する必要があります。ただし、フィールドのいずれかの画像を更新しない場合は、新しいフォームに、画像がアップロードされていないフィールドに [画像のアップロード] ボタンを表示し、画像の画像名を含むテキスト フィールドだけを表示する必要があります。アップロードされたもの。


2010 年 9 月 15 日編集:

わかりました、上記の質問のすべてを次のように単純化できると思います。

デフテスト(リクエスト):
    test_form = ユーザープロファイルフォーム()
    有効な = test_form.is_valid()

    return render( 'testing.tmpl', locals(), request )

上記のコードがレンダリングされると、「有効」は (予想どおり) False として表示されますが、「test_form」はエラーなしでレンダリングされます。モデルとモデル フォームに関するドキュメントを読みました (おそらく理解していない場合)。ほとんどの場合、指定された「インスタンス」でモデル フォーム (私の場合はユーザー プロファイル フォーム) が作成されます。ただし、1) 私はまだインスタンスを持っていません。2) インスタンス化されていないフォームにエラーが表示されることを期待しています。私が見逃しているものがあると確信しています。照らしてください。:)

もう1つ、おそらく上記の答えがとにかく答えますが、私が知る限り、is_valid()呼び出しは、UserProfileForm用に定義した「clean()」関数を呼び出すことになっています。ただし、(Python の第一人者ではありません) clean() の先頭に「raise ValidationError()」を配置しましたが、コードを実行してもエラーは表示されません。考え?

更新: 私は問題を把握しました。答えは以下のとおりです。ありがとう!

4

3 に答える 3

1

django でフォーム フィールドをクリーンアップする方法を確認する必要があります。そこでフォームから返されたデータを操作するか、あらゆる種類の検証を行うことができます!

于 2010-11-12T12:40:49.053 に答える
0

ImageFields がオプションの場合でも、それらを検証できます (それ以外の場合は正しいことを確認します)。

次に、テンプレートを調整して、アップロード済みのファイル名またはファイル アップロード フィールドを、既にアップロードしているかどうかに応じて表示します。実際には、最初のケースでは両方のフィールドを指定する方がよいでしょう。それが自動管理機能です (アップロード フィールドには「変更」というラベルが付いています)。

于 2010-11-12T14:24:32.470 に答える
0

さて、Python デバッガー (pdb) の使い方と、emacs 内で「正常に動作する」という事実を理解した後 (すごい!?)、私の (空の) フォームがバインドされていないことがわかりました。バインドされたフォームをグーグルで検索すると、次のページが表示されました。

http://docs.djangoproject.com/en/dev/ref/forms/api/

RTFM'ing 空の辞書をフォームに渡すと、すべてが期待どおりに動作し始めます。要約すると、次のような大きな違いがあります。

test_form = ユーザープロファイルフォーム() 

test_form = UserProfileForm( {} ) 

2 番目のバージョンでは、フォームのレンダリングですべてのエラーが表示されます (そして「clean()」が呼び出されます)。

これはモデレーターによって削除されるリスクがあります;) コメントしてくれたすべての人に感謝し、新しい django 開発者を待ってくれたことに感謝します。

于 2010-11-16T00:29:20.463 に答える