0

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

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

クラスでは、宣言されたフィールドと関数を確認できます。

## models.py ##
Class Object:
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )    

    name = models.CharField(verbose_name=u"Full name", max_length=200, blank=True, null=True)
    sex =   models.CharField(verbose_name=u"Sex", max_length=1, choices=GENDER_CHOICES)
    birthdate = models.DateField(verbose_name=u"Birth date", help_text="Format: DD/MM/AAAA", blank=True, null=True)
    status = models.IntegerField(verbose_name=u"Status", db_index=True, default=1)
    #...tons of other fields...

    def get_status_display(self):
        if self.status == 1:
            return "Active"
        else if self.status == 0:
            return "Inactive"
        else:
            return "Dead"

    def get_birthdate_display(self):
        return self.birthdate.strftime("%d/%m/%Y")

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

*すでに表示されているもの:
フルネーム: 利用不可 (空白のままにしたため)
性別: 男性 (M ではなく)
生年月日: 2012 年 4 月 10 日 (get_birthdate_display によって返される形式ではありません)
ステータス: 3 (文字列ではありません) get_status_display で返される)


*表示したいのは:
フルネーム: 利用不可 (空欄にしたため)
性別: 男性 (M ではなく)
生年月日: 1952 年 10 月 20 日 (get_birthdate_display の形式で)
ステータス: Dead (get_status_display で返される文字列)


したがって、手動で次のようなことをせずに、get_FIELDNAME_display がある場合は get_FIELDNAME_display を取得したいと考えています。

<p>
    <label>{% trans 'Full name' %}:</label>
    <span>{{ object.name|default:"Not available" }}</span>
</p>    
<p>
    <label>{% trans 'Sex' %}:</label>
    <span>{{ object.get_sex_display|default:"Not available" }}</span>
</p>
<p>
    <label>{% trans 'Birth Date' %}:</label>
    <span>{{ object.get_birthdate_display|default:"Not available" }}</span>
</p>
<p>
    <label>{% trans 'Status' %}:</label>
    <span>{{ object.get_status_display|default:"Not available" }}</span>
</p>

どんな助けにも感謝します!Tks

4

1 に答える 1

0

特に美しいわけではありませんがget_fields、モデルのメソッドを次のように変更できます。

def get_fields(self):
    pairs = []
    for field in self._meta.fields:
        name = field.name
        try:
            pairs.append((name, getattr(self, "get_%s_display" % name)()))
        except AttributeError:
            pairs.append((name, getattr(self, name)))
    return pairs
于 2012-04-11T17:24:06.063 に答える