Python Django:覆盖get\u FOO\u display()
一般来说,我不熟悉python重写方法和使用super()的方式 问题是:我可以覆盖Python Django:覆盖get\u FOO\u display(),python,django,Python,Django,一般来说,我不熟悉python重写方法和使用super()的方式 问题是:我可以覆盖get\u FOO\u display() 我想覆盖get_FOO_display(),因为我想使我的显示多元化 但是super(A,self).get\u unit\u display()不起作用 您应该能够通过在子类上创建具有相同名称的方法来重写超类上的任何方法。不考虑参数签名。例如: class A(object): def method(self, arg1): print "Me
get\u FOO\u display()
我想覆盖get_FOO_display(),因为我想使我的显示多元化
但是
super(A,self).get\u unit\u display()
不起作用 您应该能够通过在子类上创建具有相同名称的方法来重写超类上的任何方法。不考虑参数签名。例如:
class A(object):
def method(self, arg1):
print "Method A", arg1
class B(A):
def method(self):
print "Method B"
A().method(True) # "Method A True"
B().method() # "Method B"
class A(models.Model):
unit = models.IntegerField(choices=something)
def get_unit_display(self, value):
display = super(A, self).get_unit_display(value)
if value > 1:
display = display + "s"
return display
对于get_unit_display(),如果要更改显示值,则根本不必调用super(),但如果要使用super(),请确保使用正确的签名调用它,例如:
class A(object):
def method(self, arg1):
print "Method A", arg1
class B(A):
def method(self):
print "Method B"
A().method(True) # "Method A True"
B().method() # "Method B"
class A(models.Model):
unit = models.IntegerField(choices=something)
def get_unit_display(self, value):
display = super(A, self).get_unit_display(value)
if value > 1:
display = display + "s"
return display
请注意,我们正在将值传递给super()的get\u unit\u display()。通常,您只需重写所示的方法即可。但是这里的诀窍是超类上不存在
get\u FOO\u display
方法,因此调用super
方法将毫无用处。当通过元类将该方法添加到模型中时,该方法由字段类动态添加-请参见(编辑:过期链接为)
您可以做的一件事是为unit
字段定义一个自定义字段子类,并重写contribution\u to\u class
,以便它构造您想要的方法。不幸的是,这有点棘手
(我不明白你的第二个问题。你到底在问什么?你可以这样做:
IntegerField
以复制get\u FOO\u display
函数:
class MyIntegerField(models.IntegerField):
def contribute_to_class(self, cls, name, private_only=False):
super(MyIntegerField, self).contribute_to_class(cls, name, private_only)
if self.choices is not None:
display_override = getattr(cls, 'get_%s_display' % self.name)
setattr(cls, 'get_%s_display_override' % self.name, display_override)
MyIntegerField
:
class A(models.Model):
unit = MyIntegerField(choices=something)
def get_unit_display(self, value):
if your condition:
return your value
return self.get_unit_display_override()
FooBar类(models.Model):
foo_bar=models.CharField(u(“foo”),choices=[(1,'foo'),(2,'bar')]))
def get_foo_bar_显示(自):
返回“某物”
对不起,请忽略我解释不好的第二个问题。我弄明白了。我不知道2012年是怎么回事,但现在你可以在模型定义中添加自定义的get\u foo\u display
方法(不参考super),它将在模板渲染期间可用。不要忘记使用| safe标记
,因为您可能想要呈现html。如果是任何其他常规方法,这将是正确的,但get|FOO|u显示是由特殊的Django魔术创建的,就像在另一个答案中指出的那样。