如何在Wagtail modeladmin中从HelpPanel访问实例?

时间:2019-05-11 16:39:59

标签: python python-3.x wagtail modeladmin

在Wagtail项目的Django模型中,该模型作为Modeladmin实例连接,我想在HelpPanel中访问实例的数据:

# file: models.py

class ExpertiseApproval(models.Model):
    expertise = models.ForeignKey(
        ProfilePageExpertises,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )
    approved = models.BooleanField(
        default=False,
    )

    def get_expertise_repr(self):
        return 'Expertise: {}'.format(self.expertise)

    panels = [
        HelpPanel(
            heading='Approving expertises',
            content='{}'.format(get_expertise_repr(self)),
        ),
        FieldPanel('approved'),
    ]

但是使用上面的代码,我得到一个“未定义自我”:

# traceback snippet

    content='{}'.format(get_expertise_repr(self)),
NameError: name 'self' is not defined

面板定义中的self似乎不是我要在此处使用的模型实例中的self

有什么想法如何从此HelpPanel定义内的绑定模型实例访问数据?

1 个答案:

答案 0 :(得分:2)

我最近也有同样的问题。

事实证明,基本EditHandler类有权访问该实例。因此,如果您试图进入HelpPanel编辑处理程序的数据是模型上的字段,则您应该能够从模板中访问该字段,并在那里进行格式化。我已经使用Wagtail Page模型对此进行了测试,我相信对于Django / modeladmin模型应该是相同的。

在您的HelpPanel定义中,指定一个自定义模板:

HelpPanel(
    heading='Approving expertises',
    template='path/to/your/custom_help_panel_template.html',
)

忽略content参数,然后直接在其中添加详细信息:

<fieldset>
    {% if self.heading %}
        <legend>{{ self.heading }}</legend>
    {% endif %}
    <div class="{{ self.classname }}">Expertise: {{ self.instance.expertise }}</div>
</fieldset>

以上内容基于default HelpPanel template

这对我们有用。如果您希望HelpPanel混合到前面的字段中,甚至可以省略fieldset元素,或者如果尚未设置instance / expertise字段,则添加典型的模板逻辑以显示不同的消息。