我编写了一个模板来显示模型中的所有字段和值,它看起来像这样:
## 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在列出对象时会这样做,所以我确信有一种通用的方法可以做到这一点,我也很感激任何帮助。
答案 0 :(得分:1)
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]
然后在您的object.get_fields
上将其命名为template.html
:
<table>
{% for label, value in object.get_fields %}
<tr>
<td>{{ label }}</td>
<td>{{ value }}</td>
</tr>
{% endfor %}
</table>
答案 1 :(得分:0)
我认为你应该添加另一种方法:
def get_field_value(self, field):
try:
return self._get_FIELD_display(field)
except something:
return field._get_val_from_obj(self)
并在你的发电机中使用它。