2016-02-18 2 views
1

Я пытаюсь переопределить класс медиа в Django OpenLayersWidgetPython класс переопределение

Вот мой код:

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> 

Как-то, d Запись электронного файла 'http://openlayers.org/api/2.13/OpenLayers.js' сохраняется.

Почему это неправильно переопределяет значение js?

Для справки, здесь является определение 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

Я заглянул в код, и носитель всегда возвращает список с URL-адресом openlayers. Это видно здесь, например: https://github.com/django/django/blob/dbb0df2a0ec5bee80bee336fc81408efb30b7e47/django/contrib/gis/admin/options.py#L47 –

ответ

2

Джанго documentation говорит:

По умолчанию, любой объект с помощью статического определения носителя будет наследовать все активы, связанные с родительским виджетом. Это происходит независимо от того, как родитель определяет свои собственные требования. Например, если мы должны были расширить наш основной календарь виджет из приведенного выше примера:

Вы можете установить 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', 
     ) 
+0

Спасибо. Это объясняет наблюдаемое поведение и обеспечивает правильное обходное решение. – rawbeans

1

Вот определение _media (сам), который получает имущество СМИ:

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, список записей суперкласса добавляется в результирующий список. Другими словами, он делает то, что должен.

Смежные вопросы