9

モデルのすべてのフィールドと値を表示するテンプレートを作成しました。次のようになります。

## detail_template.html ##
{% for name, value in object.get_fields %}
    <p>
        <label>{% trans name %}:</label>
        <span>{{ value|default:"Not available" }}</span>
    </p>
{% endfor %}

クラスでは、宣言された get_fields 関数を確認できます。

## models.py ##
Class Object:
    ...many fields...

    def get_fields(self):
        return [(field.verbose_name, field._get_val_from_obj(self)) for field in self.__class__._meta.fields]

問題は、たとえば、次のような選択肢のある CharField がある場合です。

## models.py ##
GENDER_CHOICES = (
    ('M', 'Male'),
    ('F', 'Female'),
)
        ...all other fields ...
    sex =   models.CharField(verbose_name=u"Sex", max_length=1, choices=GENDER_CHOICES)

M または F が表示されます。私がやりたいことは、すべてのフィールドを手動で行うことなく、すべてのフィールドの get_NAMEFIELD_display をロードすることです。

<p>
    <label>{% trans 'Sex' %}:</label>
    <span>{{ object.get_sex_display|default:"Not available" }}</span>
</p>

私には手がかりがあります.Django Contrib Adminはオブジェクトをリストするときにそれを行うので、それを行う一般的な方法があると確信しており、助けていただければ幸いです.

4

2 に答える 2

11

ジャンゴ >= 2.0

field._get_val_from_obj()代わりに Django 2.0 の使用で削除されますfield.value_from_object()

get_fields()あなたに追加models.py

class Object(Model):
    field1 = CharField(max_length=150)
    field2 = CharField(max_length=150)

    def get_fields(self):
        return [(field.verbose_name, field.value_from_object(self)) for field in self.__class__._meta.fields]

次に、次のように呼び出しobject.get_fieldsますtemplate.html

<table>
    {% for label, value in object.get_fields %}
        <tr>
            <td>{{ label }}</td>
            <td>{{ value }}</td>
        </tr>
    {% endfor %}
</table>
于 2019-12-08T16:58:43.170 に答える
0

別の方法を追加する必要があると思います:

def get_field_value(self, field):
    try:
        return self._get_FIELD_display(field)
    except something:
        return field._get_val_from_obj(self)

そして、ジェネレーターで使用します。

于 2012-04-06T06:01:30.003 に答える