【问题标题】:What is the proper way to create draft page programatically in the Wagtail?在 Wagtail 中以编程方式创建草稿页面的正确方法是什么?
【发布时间】:2021-07-05 18:32:06
【问题描述】:

我只是为了保存页面:

parent_page = Page.objects.get(title="parent")
page = Page(title="child", owner=request.user)
parent_page.add_child(instance=page)
page.save() # not sure if this required

如果我需要保存草稿页怎么办?这段代码似乎可以工作,但我不确定它是否正确:

parent_page = Page.objects.get(title="parent")
page = Page(title="child", live=False, owner=request.user)
parent_page.add_child(instance=page)
page.save_revision()
page.save()

是否需要在 page.save_revision() 之后调用 page.save()?

在我的情况下,使用此代码一切正常,但我注意到 PageRevision.user_id 为空。它将如何影响我的代码? 从 wagtail 代码中,我看到我可以使用用户参数保存修订:

page.save_revision(user=request.user, log_action=True)

我已经在没有用户的情况下保存了修订,并且没有看到任何副作用。这个领域有多关键?我是否需要为所有现有修订填写 user_id 字段?

附:看起来最好将此代码包装在事务中,因为当它由于验证错误manage.py fixtree而失败时,请显示错误Incorrect numchild value

【问题讨论】:

    标签: django wagtail revision addchild


    【解决方案1】:

    在任何一种情况下都不需要page.save() - parent_page.add_child 处理保存。 (这可能是导致 manage.py fixtree 问题的原因 - django-treebeard doesn't update in-memory instances after database operations,因此像 numchild 这样的字段可能会以不正确的值保存。)

    修订版上的user 字段是可选的,因为对页面的更改并不总是由用户执行 - 它们可能像您一样以编程方式完成。它只是用于记录目的(例如,显示在 Wagtail 管理员页面的修订历史记录中)。

    【讨论】:

    • 感谢您的回答。我不需要这些页面的历史记录,所以我可以假设我根本不需要修订吗?我的意思是在不修改的情况下创建草稿页面是否安全?同样正如我所说,我对这段代码的纯粹经验告诉我将代码包装到事务中。它可以在 django 中轻松完成:装饰器 @transaction.atomic 或上下文管理器 with transaction.atomic()
    • 不,您不需要修订对象 - 如果没有找到,编辑界面将退回到编辑“真实”页面对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多