Django DetailView 模板显示所有字段的显示值

sta*_*dev 7 django templates django-templates django-admin detailview

我制作了一个模板来显示模型中的所有字段和值,它看起来像这样:

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

在类中,您可以看到声明的 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]
Run Code Online (Sandbox Code Playgroud)

问题是,例如,当我有一个带有选项的 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)
Run Code Online (Sandbox Code Playgroud)

它显示 M 或 F,我想要做的是加载所有字段的 get_NAMEFIELD_display 而无需手动执行所有字段:

<p>
    <label>{% trans 'Sex' %}:</label>
    <span>{{ object.get_sex_display|default:"Not available" }}</span>
</p>
Run Code Online (Sandbox Code Playgroud)

我有一个线索:Django Contrib Admin 在列出对象时会这样做,所以我确定有一种通用的方法可以做到这一点,我也很感激任何帮助。

JV *_*eil 9

Django >= 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]
Run Code Online (Sandbox Code Playgroud)

然后将其称为object.get_fields您的template.html

<table>
    {% for label, value in object.get_fields %}
        <tr>
            <td>{{ label }}</td>
            <td>{{ value }}</td>
        </tr>
    {% endfor %}
</table>
Run Code Online (Sandbox Code Playgroud)


ilv*_*var 0

我认为你应该添加另一种方法:

def get_field_value(self, field):
    try:
        return self._get_FIELD_display(field)
    except something:
        return field._get_val_from_obj(self)
Run Code Online (Sandbox Code Playgroud)

并在你的发电机中使用它。