У меня есть модель на основе Django models.Model
, которую я регистрирую через ModelAdmin
в представлении администратора. Одно из моих полей имеет свой собственный виджет.
# models.py
panels = [
# ...
CustomFieldPanel('geom', widget=LeafletWidgetWithMedia)
# ...
]
Мне нужен контекст виджетов, чтобы быть в курсе экземпляра модели. Вот то, что я пробовал до сих пор, основываясь на ответе вопрос , который я опубликовал ранее. Я обновил FieldPanel
, чтобы передать экземпляр виджету.
class CustomFieldPanel(FieldPanel):
def on_instance_bound(self):
self.widget = LeafletWidgetWithMedia(page_instance=self.instance)
Затем я обновил функции __init__
и get_context
виджета:
class LeafletWidgetWithMedia(LeafletWidget):
include_media = True
template_name = "admin/widget.html"
def __init__(self, attrs=None, **kwargs):
print("Kwargs: " + str(kwargs))
self.page_instance = kwargs.pop("page_instance", None)
print("Instance: " + str(type(self.page_instance)))
# ...
def get_context(self, name, value, attrs):
value = None if value in validators.EMPTY_VALUES else value
context = super(LeafletWidget, self).get_context(name, value, attrs)
context["page_instance"] = self.page_instance
context.update(self._get_attrs(name, attrs))
print("Page instance in context: " + str(self.page_instance))
return context
This подход работает безупречно, если моя модель основана на модели Wagtails Page
, но здесь контекст не будет обновляться. Операторы печати в __init__
показывают, что экземпляр передается виджету:
# Kwargs: {'page_instance': <MyModel: 7>}
# Instance: <class 'register.models.MyModel'>
Но экземпляр, похоже, никогда не достигнет get_context
. Оператор печати в get_context
показывает:
# Page instance in context: None
Проверка контекста визуализированных шаблонов показывает, что ключ задан, но значение равно none
.
# admin/widget.html
# ...
'name': 'geom',
'page_instance': None,
'required': True,
# ...
Может кто-то потерять свет на это?