如何覆盖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查找它)实际上会给你一个对SuperFooname字段的引用,所以改变它的verbose_name将在两个模型中改变它。

此外,为Foo类添加name字段也不起作用,因为...

在父模型中重写字段会导致在初始化新实例(指定哪个字段在Model.__init__ )和序列化等方面的Model.__init__ 。 这些是正常的Python类继承不需要以相同的方式处理的特性,所以Django模型继承和Python类继承之间的区别不仅仅是任意的。

链接地址: http://www.djcxy.com/p/33687.html

上一篇: 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