20

Formソース コードから、Django 1.4 のクラスにhas_changed()メソッドとプロパティが含まれていることがわかりchanged_dataます。これらはかなり便利に見えますが、文書化されていません。私の質問は次のとおりです。これらの作業を期待どおりに行います。

  • ではForm.clean()、フォーム データが変更された場合はをForm.has_changed()返します。変更されていない場合はTrueFalse
  • Form.clean()Form.changed_data値が変更されたフィールド名のリストです。

もしそうなら、文書化されていない機能の使用に関する通常の警告/危険 (つまり、変更される可能性がある、サポートされていないなど) とは別に、それらを使用しない特定の理由はありますか?

注 1: これらをカスタム ウィジェットと連携_has_changed()させるには、組み込みウィジェット用に定義されたメソッドがこれらのウィジェットに必要です。

注 2: 興味深いことに、ドキュメンテーションにはFormset.has_changed()メソッドについての無造作な言及が含​​まれていますが、Form.has_changed().

4

3 に答える 3

24

Django ソースをさらに調べた後、Florian の回答から役立つヒントを得て、それを報告し、新しいデータと比較するための初期データを取得する方法がフォームにある限り、質問で説明されているように作業を行うhas_changedことができます。changed_data

問題は、POST データから作成されたフォームが、GET フォームの初期値が何であったかをどのように知るのかということです。簡単に言えば、そうではないということです。それを伝えるには、次の 2 つの方法があります。

  1. initialフォームへのキーワード引数および/またはinitialフィールドへのキーワード引数を介して、GET フォームに初期値を伝えるのとまったく同じ方法です。注: これを行う場合は、GET フォームと POST フォームに同じ値を使用するようにしてください。初期値が何であるかを直接制御するため、これが真に信頼できる唯一の方法です。

  2. 該当するフィールドごとにshow_hidden_initialキーワード引数を に設定することで、GET からの初期値を Django に記憶させます。Trueこれらのフィールドの場合、Django は非表示の入力要素を初期値とともに GET フォームの HTML にレンダリングします。後でPOST フォームでhas_changedまたはを呼び出すと、 aschanged_dataを含むフィールドに対してshow_hidden_initial、 Django は POST データの非表示の入力要素から初期値を自動的に取得します (フォームまたはフィールド引数Trueからの初期値に取って代わります)。initial注: POST データに依存するものと同様に、このアプローチは最終的には信頼できません。

于 2012-08-14T14:12:53.820 に答える
7

これらのメソッドは、次の 2 つの条件で利用できます。

  1. ポスト リクエスト中にもフォーム コンストラクターに初期データ dict を渡します。
  2. ではフィールドを使用しませんshow_hidden_initial=True。(このようなフィールドの問題は、ユーザーが比較に使用される初期値も送信できるため、信頼できないことです。)
于 2012-08-05T15:09:26.120 に答える