Трясогузка: передать экземпляр модели vanilla Django в виджет - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть модель на основе 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,
# ...

Может кто-то потерять свет на это?

...