【问题标题】:Wagtail - how do I add extra form fields (not from page model) to admin page edit form and get wagtail renderingWagtail - 如何将额外的表单字段(不是来自页面模型)添加到管理页面编辑表单并获得 wagtail 渲染
【发布时间】:2017-03-31 04:21:58
【问题描述】:

这是我尝试过的。它可以工作,但额外的字段 text1 被渲染为一个没有标签的普通输入字段,也没有很酷的 wagtail 渲染。请问如何在表单中添加额外的字段并获得很酷的 wagtail 渲染?

这是 WagtailAdminPageForm 文档的link

class Review(models.Model):

    page = models.OneToOneField(
        'wagtailcore.Page',
        verbose_name=('page'),
        related_name='review',
        on_delete=models.CASCADE)
    text1 = models.CharField(null=True, blank=True, max_length=50)


class RandomPageForm(WagtailAdminPageForm):
    """ Custom form for RandomPage """

    text1 = forms.CharField() # <-- extra field here!

    def __init__(self, data=None, files=None, parent_page=None, *args, **kwargs):
        super(RandomPageForm, self).__init__(data, files, *args, **kwargs)

        if self.instance.id:
            review, created = Review.objects.get_or_create(page_id=self.instance.id)
            print "set form.text1 to model.text1"
            self.fields['text1'].initial = review.text1

        # !!! Below has no effect
        self.instance.content_panels = Page.content_panels + [
            FieldPanel('body'),
            FieldPanel('text1'),
        ]

    def save(self, commit=True):
        page = super(RandomPageForm, self).save(commit=False)
        review, created = Review.objects.get_or_create(page=page)
        review.text1 = self.data["text1"]
        review.save()
        return page

class RandomPage(Page):

    body = RichTextField(blank=True)

    content_panels = Page.content_panels + [
        FieldPanel('body', classname="full"),
    ]

    base_form_class = RandomPageForm

【问题讨论】:

  • 已发布暂定答案,尽管我意识到将FieldPanel('text1') 移动到 RandomPage 可能不是一个选择(包括“我尝试这样做,但它坏了”:-))如果是这种情况,请更新问题以详细说明。
  • 是的 :-) 当我为 text1 添加 FieldPanel 时,RandomPage 生气了。因为模型中不存在 text1。欢迎提出更多建议,谢谢。

标签: django wagtail


【解决方案1】:

在每个实例的基础上编辑面板定义将不起作用,因为面板定义被编译成一个 EditHandler 对象,该对象在类级别缓存:https://github.com/wagtail/wagtail/blob/48949e69a7a7039cb751f1ee33ecb32187004030/wagtail/wagtailadmin/edit_handlers.py#L804

对于您发布的代码 sn-p,看起来将 FieldPanel('text1') 移动到 RandomPage 的 content_panels sn-p 应该可以完成这项工作(尽管我从未尝试过使用非模型字段)。

【讨论】:

    【解决方案2】:

    我刚刚意识到 sn-ps 可能会解决我的问题。这听起来正是我需要的。所以我将我的非页面模型注册为 sn-p 并获得 wagtaill 渲染。我会检查并确认。

    关于 sn-ps 的文档: http://docs.wagtail.io/en/v1.9/topics/snippets.html

    【讨论】:

    • 你能按承诺确认吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多