Wagtail:如何将模型实例传递给小部件并在模板中访问它

2024-04-26 10:31:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基于Wagtails Page模型的模型,我正在为其中一个模型字段分配一个自定义小部件。在呈现管理视图时,是否可以在widgets HTML模板中访问模型实例?我需要admin视图中的小部件知道SimplePage小部件属于哪个ID,即获取{{ page.id }}的值

# models.py
class SimplePage(Page):

    name = RichTextField(blank=True)
    geom = PointField()

    content_panels = Page.content_panels + [
        FieldPanel("name"),
        FieldPanel("geom", widget=LeafletWidgetWithMedia()),
    ] 
# widgets.py
class LeafletWidgetWithMedia(LeafletWidget):
    include_media = True
    template_name = "admin/widget.html"

我知道我可以像这样更新我的小部件的上下文:

# widgets.py
# ...
    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.update(self._get_attrs(name, attrs))
        return context

但是我不知道如何将我的SimplePage实例放入小部件中以更新上下文。(我还尝试了Wagtailsbefore_edit_page{a1},但没有成功。)


Tags: 实例namepy模型self视图getadmin
1条回答
网友
1楼 · 发布于 2024-04-26 10:31:30

此信息可用于编辑处理程序,而不是小部件。您可以使用自定义编辑处理程序,一旦小部件知道页面实例是什么,它就会重新初始化小部件。大概是这样的:

class LeafletPanel(FieldPanel):

    def on_instance_bound(self):
        self.widget = LeafletWidgetWithMedia(page_instance=self.instance)

当面板绑定到页面对象时on_instance_bound()被调用。注意,当创建一个新页面时,不会调用它-因此您可能需要小部件中的一些逻辑来处理这种情况

然后在初始化时调整LeafletWidgetWithMedia以接受此instance参数,并可以将其从get_context()方法传递到上下文中:

class LeafletWidgetWithMedia(LeafletWidget):

    def __init__(self, *args, **kwargs):
        self.instance = kwargs.pop('page_instance', None)
        super().__init__(*args, **kwargs)

    def get_context(self, name, value, attrs):
        # ...
        context['page_instance'] = self.instance
        return context

   

相关问题 更多 >