我该如何动态获取Django模型字段的verbose name?

46

我希望能够访问我的模型字段 verbose_name。

我可以使用字段索引来获取它,就像这样:

model._meta._fields()[2].verbose_name

但我需要动态获取它。理想情况下,它应该是像这样的:

model._meta._fields()['location_x'].verbose_name

我看了几个东西,但就是找不到它。

8个回答

49

对于 Django < 1.10:

model._meta.get_field_by_name('location_x')[0].verbose_name

我收到了“'str' object has no attribute '_meta'”错误。Django 1.7。 - Mikhail Batcer
5
我知道这可能不太好意思,但是...“字符串”没有字段。 - Ignacio Vazquez-Abrams
2
好的,我有一个模板过滤器:def verbose_name(value, arg): return value._meta.get_field_by_name(arg)[0].verbose_name ,在模板中使用:{{ book|verbose_name:"title" }} - Mikhail Batcer
你是如何注册这个过滤器的? - Ignacio Vazquez-Abrams
2
get_field_by_name 方法已在 Django 1.10 中被移除,建议使用下面提供的 get_field 方法,看起来不那么像 hack... - DrBuck
显示剩余3条评论

30

model._meta.get_field('location_x').verbose_name


20

对于Django 1.11和2.0:

MyModel._meta.get_field('my_field_name').verbose_name

更多信息请参考Django文档


14

所选答案提供了一个代理对象,可能如下所示。

<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


7
model._meta.get_field_by_name('location_x')[0].verbose_name

5
您也可以使用:
Model.location_x.field.verbose_name

Model是一个类名。我在我的Animal模型上测试了这个:

Animal.sale_price.field.verbose_name

Animal.sale_price返回一个DeferredAttribute,其中有一些元数据,比如verbose_name。

注意:我正在使用Django 3.1.5。


2

如果您想迭代所有字段,您需要获取field

for f in BotUser._meta.get_fields():
    if hasattr(f, 'verbose_name'):
        print(f.verbose_name)

1
赞!这比这里大多数解决方案都要好!没有绕弯子(不需要指定任何“字段”)。而且是动态的。 - carla

0
# 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接