Python class 覆盖

Python class override

我正在尝试覆盖 Django OpenLayersWidget

中的媒体 class

这是我的代码:

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',
        )

这是获取媒体的 _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

基本上,当您调用[您的class].media 时,superclasses 条目的列表会添加到结果列表中。换句话说,它正在做它应该做的事情。

Django documentation 说:

By default, any object using a static Media definition will inherit all the assets associated with the parent widget. This occurs regardless of how the parent defines its own requirements. For example, if we were to extend our basic Calendar widget from the example above:

您可以在 Media class 中设置 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',
        )