如何覆盖django中超类模型字段的详细名称
假设我有一个从SuperFoo继承的模型Foo:
class SuperFoo(models.Model):
name = models.CharField('name of SuperFoo instance', max_length=50)
...
class Foo(SuperFoo):
... # do something that changes verbose_name of name field of SuperFoo
在Foo类中,我想覆盖SuperFoo的名称字段的verbose_name。 我可以吗? 如果不是,在模型表单定义中设置一个标签以将其显示在模板中是最佳选择吗?
我用过的简单黑客是:
class SuperFoo(models.Model):
name = models.CharField('name of SuperFoo instance', max_length=50)
...
class Foo(SuperFoo):
... # do something that changes verbose_name of name field of SuperFoo
Foo._meta.get_field('name').verbose_name = 'Whatever'
考虑到修改Foo._meta.fields的警告也会影响超类 - 因此只有在超类是抽象类时才真正有用,我已经将@Gerry放弃的答案包装为可重用的类装饰器:
def modify_fields(**kwargs):
def wrap(cls):
for field, prop_dict in kwargs.items():
for prop, val in prop_dict.items():
setattr(cls._meta.get_field(field), prop, val)
return cls
return wrap
像这样使用它:
@modify_fields(timestamp={
'verbose_name': 'Available From',
'help_text': 'Earliest date you can book this'})
class Purchase(BaseOrderItem):
pass
上面的例子改变了继承字段'timestamp'的verbose_name和help_text。 您可以传入与您想要修改的字段一样多的关键字参数。
你最好的选择是在表单中设置/更改标签。 引用Foo
模型的name
字段(例如,通过在Foo._meta.fields
查找它)实际上会给你一个对SuperFoo
的name
字段的引用,所以改变它的verbose_name
将在两个模型中改变它。
此外,为Foo
类添加name
字段也不起作用,因为...
在父模型中重写字段会导致在初始化新实例(指定哪个字段在Model.__init__
)和序列化等方面的Model.__init__
。 这些是正常的Python类继承不需要以相同的方式处理的特性,所以Django模型继承和Python类继承之间的区别不仅仅是任意的。
上一篇: how to override the verbose name of a superclass model field in django
下一篇: How to close activity and go back to previous activity in android