Django DetailView 模板显示所有字段的 get_FIELDNAME_display() 值
Posted
技术标签:
【中文标题】Django DetailView 模板显示所有字段的 get_FIELDNAME_display() 值【英文标题】:Django DetailView Template show get_FIELDNAME_display() values of all fields 【发布时间】:2012-04-23 21:18:32 【问题描述】:我制作了一个模板来显示模型中的所有字段和值,它看起来像这样:
## 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)出生日期:20/10/1952(格式在 get_birthdate_display 中) 状态:死亡(get_status_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>
感谢您的帮助!提示
【问题讨论】:
【参考方案1】:不是特别漂亮,但您可以将模型中的 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
【讨论】:
在getattr(self, "get_%s_display" % name)
之后添加了()
。认为你需要这些 - 但我还没有测试过。以上是关于Django DetailView 模板显示所有字段的 get_FIELDNAME_display() 值的主要内容,如果未能解决你的问题,请参考以下文章
django如何循环通过通用detailview传回的上下文对象?