2017-05-04 110 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