2017-05-04 108 views
2

在w project项目中,我有一个用于公告的NewsSnippet片段。从页面更新创建的W distinguish辨别页面

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

CoursePage的子女来自型号Course。此模型只包含start_dateend_datestatus(可用或已预订)以及其他一些我认为对此问题并不重要的模型。

添加新CourseCoursePage意味着有CoursePage类型中的start_date新的课程。 Course模型源自AbstractForm,并允许在相应的日期注册课程。

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

我认为这可以在通过base_class_form = Myform使用的course模型形式的save方法要么完成了,但是,我不知道如何区分“发布”从“保存为草稿”那里。我也考虑过在文档中使用信号,并且page_published看起来很有前途,但是文档说:“当修订版被设置为发布时,该信号从PageRevision发出。”但是,我不想公布每一次修订,只是第一次创建。有没有办法确定page_published是否是Page首次被解雇?

此外(这可能是第二个问题),有没有很好的和容易理解的例子如何使用您的应用程序的ready()方法实现信号?

回答

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()方法)。我会看看这是否有任何影响...

0

对于准备好()流程 你可以在你的应用程序目录 中创建signal.py,并把你的接收器逻辑放在里面。

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

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

    def ready(self): 
     from . profiles import signals