Python类覆盖

时间:2016-02-18 22:19:34

标签: python django class override

我试图覆盖Django OpenLayersWidget中的Media类

这是我的代码:

class OpenLayersWidgetHttps(OpenLayersWidget):
    class Media:
        js = (
            'https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js',
            'gis/js/OLMapWidget.js',
        )

然而,当我尝试:

w = OpenLayersWidgetHttps()
print(w.media)

我明白了:

<script type="text/javascript" src="http://openlayers.org/api/2.13/OpenLayers.js"></script>
<script type="text/javascript" src="/static/gis/js/OLMapWidget.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js"></script>

不知何故,保留了'http://openlayers.org/api/2.13/OpenLayers.js'的默认媒体条目。

为什么这不能正确覆盖js的值?

供参考,以下是Django源代码中OpenLayersWidget的定义:

class OpenLayersWidget(BaseGeometryWidget):
    template_name = 'gis/openlayers.html'

    class Media:
        js = (
            'http://openlayers.org/api/2.13.1/OpenLayers.js',
            'gis/js/OLMapWidget.js',
        )

2 个答案:

答案 0 :(得分:2)

Django documentation说:

  

默认情况下,使用静态媒体定义的任何对象都将继承与父窗口小部件关联的所有资源。无论父级如何定义自己的要求,都会发生这种情况。例如,如果我们要从上面的示例扩展我们的基本Calendar小部件:

您可以在Media类中设置extend = False以生成没有继承值的media变量。

class OpenLayersWidgetHttps(OpenLayersWidget):
    class Media:
        extend = False
        js = (
            'https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js',
            'gis/js/OLMapWidget.js',
        )

答案 1 :(得分:1)

以下是获取媒体属性的_media(self)的定义:

def _media(self):
    # Get the media property of the superclass, if it exists
    sup_cls = super(cls, self)
    try:
        base = sup_cls.media
    except AttributeError:
        base = Media()

    # Get the media definition for this class
    definition = getattr(cls, 'Media', None)
    if definition:
        extend = getattr(definition, 'extend', True)
        if extend:
            if extend is True:
                m = base
            else:
                m = Media()
                for medium in extend:
                    m = m + base[medium]
            return m + Media(definition)
        else:
            return Media(definition)
    else:
        return base

基本上,当您调用[您的类] .media时,超类条目的列表将添加到结果列表中。换句话说,它做了它应该做的事情。