我试图覆盖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',
)
答案 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时,超类条目的列表将添加到结果列表中。换句话说,它做了它应该做的事情。