在wagtail项目中,我有一个用于公告的NewsSnippet
代码段。
此外(略微简化),我有一个页面模型CoursePage
,其中包含所提供课程的说明。
CoursePage
的孩子来自模型Course
。此模型只包含start_date
和end_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()
方法实现信号,是否有好的且易于理解的示例?
答案 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