我希望能够访问我的模型字段 verbose_name。
我可以使用字段索引来获取它,就像这样:
model._meta._fields()[2].verbose_name
但我需要动态获取它。理想情况下,它应该是像这样的:
model._meta._fields()['location_x'].verbose_name
我看了几个东西,但就是找不到它。
对于 Django < 1.10:
model._meta.get_field_by_name('location_x')[0].verbose_name
model._meta.get_field('location_x').verbose_name
所选答案提供了一个代理对象,可能如下所示。
<django.utils.functional.__proxy__ object at 0x{SomeMemoryLocation}>
如果有人看到相同的问题,你可以在代理对象的title()成员函数中找到冗长名称的字符串。
model._meta.get_field_by_name(header)[0].verbose_name.title()
更好的写法是:
model._meta.get_field(header).verbose_name.title()
header
将是您感兴趣的字段的名称,例如在OP的上下文中为“location-x”。
注意:Django的开发人员也认为使用get_field
更好,因此已经在Django 1.10中弃用了get_field_by_name
。因此,无论您使用哪个版本的Django,我建议使用get_field
。
model._meta.get_field_by_name('location_x')[0].verbose_name
Model.location_x.field.verbose_name
Model是一个类名。我在我的Animal模型上测试了这个:
Animal.sale_price.field.verbose_name
Animal.sale_price返回一个DeferredAttribute,其中有一些元数据,比如verbose_name。
注意:我正在使用Django 3.1.5。
如果您想迭代所有字段,您需要获取field
:
for f in BotUser._meta.get_fields():
if hasattr(f, 'verbose_name'):
print(f.verbose_name)
# select fields for bulk_update : exclude primary key and relational
fieldsfields_to_update = []
for field_to_update in Model._meta.get_fields():
if not field_to_update.many_to_many and not field_to_update.many_to_one and not field_to_update.one_to_many and not field_to_update.one_to_one and not field_to_update.primary_key and not field_to_update.is_relation :
fields_to_update = fields_to_update + [field_to_update.name]
Model.objects.bulk_update(models_to_update , fields_to_update)
def verbose_name(value, arg): return value._meta.get_field_by_name(arg)[0].verbose_name
,在模板中使用:{{ book|verbose_name:"title" }}
- Mikhail Batcerget_field_by_name
方法已在 Django 1.10 中被移除,建议使用下面提供的get_field
方法,看起来不那么像 hack... - DrBuck