1. ホーム
  2. python

[解決済み】テンプレートでモデルインスタンスのフィールド名と値を反復処理する

2022-04-13 19:42:15

質問

選択されたインスタンスのフィールド値を、その名前とともに表示する基本的なテンプレートを作ろうとしています。 最初の列にフィールド名(フィールドに指定されている場合は特にverbose_name)、2番目の列にそのフィールドの値を含む、表形式のそのインスタンスの値の単なる標準出力とお考えください。

例えば、以下のようなモデル定義があるとする。

class Client(Model):
    name = CharField(max_length=150)
    email = EmailField(max_length=100, verbose_name="E-mail")

このようにテンプレートに出力してほしい(与えられた値を持つインスタンスを想定)。

Field Name      Field Value
----------      -----------
Name            Wayne Koorts
E-mail          [email protected]

私が実現したいのは、モデルのインスタンスをテンプレートに渡して、テンプレート内で動的に反復処理できるようにすることで、次のようなものです。

<table>
    {% for field in fields %}
        <tr>
            <td>{{ field.name }}</td>
            <td>{{ field.value }}</td>
        </tr>
    {% endfor %}
</table>

これを行うためのきちんとした、"Django-approved"な方法はありますか? これは非常に一般的なタスクのようで、この特定のプロジェクトで頻繁に行う必要があります。

どのように解決するのですか?

model._meta.get_all_field_names() を使えば、モデルのすべてのフィールド名を得ることができます。 model._meta.get_field() で冗長な名前に辿り着き、さらに getattr(model_instance, 'field_name') を使ってモデルから値を取得します。

注意 model._meta.get_all_field_names() は django 1.9 で非推奨となりました。代わりに model._meta.get_fields() でモデルのフィールドを取得し field.name を使用して各フィールド名を取得します。