Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:覆盖get\u FOO\u display()_Python_Django - Fatal编程技术网

Python Django:覆盖get\u FOO\u display()

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

一般来说,我不熟悉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 "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
,以便它构造您想要的方法。不幸的是,这有点棘手


(我不明白你的第二个问题。你到底在问什么?

你可以这样做:

  • 覆盖Django
    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)
    
  • 最后,使用copy函数返回超级值:

       def get_unit_display(self, value):
           if your condition:
              return your value
           return self.get_unit_display_override()
    
  • 现在在Django>:

    已恢复覆盖get#FOO_display()的功能(#30931)

    您可以覆盖:

    
    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魔术创建的,就像在另一个答案中指出的那样。