2

forループではなく、Modelformのフィールドを個別に解析したいと思います。そして、いくつかのフィールドでその要素のDjangoHTMLを解析したいと思います。私はこれを持っています:

<form action="#" method="POST" name="notifictaionForm">
    <ul>  
        <li><label>{{ form.fields.title.label }}</label> <span>{{ notification.title }}</span></li>
        <li><label>{{ form.fields.create_date.label }}</label> <span>{{ notification.create_date }}</span></li>
        <li><label>{{ form.fields.description.label }}</label> <span>{{ notification.description }}</span></li>
        <li><label>{{ form.fields.status.label }}</label> <span>{{ form.fields.status.??? }}</span></li>
    </ul>
</form>

したがって、フィールドの名前は解析できますが、HTML要素は解析できません。???テンプレートコードので、DjangoHTMLフォーム要素を解析したいと思います。

誰かがこれを行う方法を知っていますか?

4

1 に答える 1

9

私があなたをよく理解しているなら、あなたはdjangoの自動生成されたstatusフィールド用のhtmlが欲しいですか?次に、それは非常に簡単です。

{{ form.status }}

いくつかの余分な言葉:

フォームは、次のようにフィールドにアクセスできるdictのようなオブジェクトです。

>>> form['field_name']

宣言されたフィールドはform.fieldsSortedDictオブジェクトに格納されます。したがって、この変数を使用してフィールドにアクセスできますが、推奨される方法が常に最短の方法です。

Pythonを初めて使用する場合、フィールドを属性として宣言するにはどうすればよいのか疑問に思うかもしれませんが、次のようなPythonコードからフィールドにアクセスすることはできません。

>>> form.field_name
AttributeError: 'Form' object has no attribute 'field_name'

Pythonのクラスは静的ではないため、メタクラスを使用して、クラス定義からあらゆる種類の新しいものを構築できます。Djangoはそれを利用してフレンドリーなAPIを作成します。基本的には次のようになります。

  1. PythonインタープリターはFormクラスを解析します。
  2. インタープリターは、 DeclarativeFieldsMetaclass__metaclass__から継承されdjango.forms.Form、次のように設定されている属性を検索します。
  3. メタクラスはクラスを再構築します。属性が削除され、.base_fields属性が作成されます。
  4. どうして?base_fields_ fieldsこれは別の話です。これは、ModelFormのモデルに由来するフィールドが、フォームクラスで宣言されたフィールドからどのように分離されるかと関係があります。

class Metaただし、メタクラスを、フォームまたはモデルに追加の構成オプションを提供するために使用されることがあるメタクラスと混同しないでください。

テンプレートに戻りましょう。Pythonコードからアクセスできないform.field_nameのに、なぜテンプレートでアクセスできるのでしょうか。djangoのドキュメントで説明されているように、テンプレートシステムがドットを検出すると、次のルックアップをこの順序で試行します。

  • 辞書検索
  • 属性ルックアップ
  • メソッド呼び出し
  • リストインデックスルックアップ

つまり、テンプレートシステムは、次の問題が発生したときに最初に返そうとし{{ form.field_name }}ますform['field_name']

于 2011-04-19T11:31:14.133 に答える