Wagtail区分页面已更新

时间:2017-05-04 21:27:58

标签: wagtail

在wagtail项目中,我有一个用于公告的NewsSnippet代码段。

此外(略微简化),我有一个页面模型CoursePage,其中包含所提供课程的说明。

CoursePage的孩子来自模型Course。此模型只包含start_dateend_date以及status(可用或已预订)以及我认为对此问题不重要的更多内容。

Course添加新的CoursePage表示CoursePage处有一个start_date类型的新课程。 Course模型源自AbstractForm,并允许在相应日期注册课程。

我想在创建新NewsSnippet时自动宣布(即创建Course)。但是,如果刚刚更新了Course,我就不希望创建新的NewsSnippet。此外,我只希望在NewsSnippet页面发布时创建Course,而不是保存为草稿。

我认为这可以通过save course模型使用的base_class_form = Myform方法完成,但是,我不知道如何区分和#34;发布"从"保存为草稿"那里。我还考虑过在文档中使用信号,page_published看起来很有希望,但文档说:"当修订版设置为发布时,此信号从PageRevision发出。&#34 ;但是,我不想宣布每一次修订,而只是第一次创作。有没有办法找出page_published是否首次触发Page

此外(这可能是第二个问题),如何使用应用的ready()方法实现信号,是否有好的且易于理解的示例?

3 个答案:

答案 0 :(得分:0)

您是否考虑过与after_create_page挂钩?这应该有效:

http://docs.wagtail.io/en/v1.10/reference/hooks.html#after-create-page

答案 1 :(得分:0)

以下是我现在实施的方式:

# the page model
class MyPage( Page ):
    # model definitions
    pass

# The snippet
class NewsSnippet( models.Model ):
    # Some definitions...
    # A ForeignKey to the PageModel:
    linked_page = models.ForeignKey(
        'wagtailcore.Page', null = True, blank = True,
        on_delete=models.SET_NULL, related_name = '+',
    )

# The function called from the signal:
def publish_news( sender, **kwargs ):
    instance = kwargs['instance']
    has_been_published = (
        NewsSnippet.objects.filter( linked_page = instance ) > 0
    )
    if not has_been_published:
        news = NewsSnippet()
        news.linked_page = instance
        # add content according to the snippet definition
        # ...
        news.save()

# register the signal
page_published.connect( publish_news, sender = MyPage )    

到目前为止,这就是我想要的。但是,通过应用程序的ready()方法(尚未)实现。我会看看这是否有任何影响...

答案 2 :(得分:0)

对于ready()流程 您可以在app目录中创建signal.py 并将接收器逻辑放入其中。

然后在app.py中,您可以使用ready()方法初始化这些信号。

class ProfilesConfig(AppConfig):
    name = 'profile'
    verbose_name = "Profiles"

    def ready(self):
        from . profiles import signals