2017-05-04 2 views
2

In einer Bachstelze Projekt habe ich eine NewsSnippet Snippet, die für Ankündigungen verwendet wird.Bachstelze zu unterscheiden Seite erstellt von Seite aktualisiert

Außerdem (etwas vereinfacht) habe ich ein Seitenmodell CoursePage, das Beschreibungen der Kurse enthält, die angeboten werden.

Kinder von CoursePage stammen aus dem Modell Course. Dieses Modell enthält nur start_date und end_date und eine status (verfügbar oder ausgebucht) und einige mehr, die ich glaube, ist nicht wichtig für diese Frage.

ein neues Course zu einem CoursePage Hinzufügen bedeutet, dass es einen neuen Kurs vom Typ CoursePage bei start_date. Das Course Modell ist von AbstractForm abgeleitet und ermöglicht die Registrierung für den Kurs zum entsprechenden Datum.

Ich möchte automatisch anmelden (dh, erstellen Sie eine NewsSnippet), wenn eine neue Course erstellt wird. Wenn jedoch eine Course gerade aktualisiert wird, möchte ich nicht eine neue NewsSnippet erstellt werden. Außerdem möchte ich nur die NewsSnippet erstellt werden, wenn die Course Seite veröffentlicht wird, nicht als Entwurf gespeichert.

Ich dachte, dies kann entweder in den save Verfahren einer vom course Modell über base_class_form = Myform jedoch verwendete Form geschehen, ich weiß nicht, wie „veröffentlichen“ von dort „als Entwurf speichern“ zu unterscheiden. Ich habe auch überlegt, Signale wie in der Dokumentation zu verwenden, und page_published sieht vielversprechend aus, aber die Dokumentation sagt: "Dieses Signal wird von einem PageRevision ausgegeben, wenn eine Revision auf public gesetzt ist." Ich möchte jedoch nicht jede Revision ankündigen, sondern nur die erste Kreation. Gibt es eine Möglichkeit herauszufinden, ob page_published zum ersten Mal für eine Page ausgelöst wird?

Außerdem (das könnte eine zweite Frage sein), gibt es ein gutes und leicht zu verstehendes Beispiel, wie man Signale mit der ready() Methode Ihrer App implementiert?

Antwort

0

Haben Sie in Betracht gezogen, in den after_create_page Haken zu binden? Das sollte funktionieren:

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

+0

Dieser Hook wird auch aufgerufen, wenn eine Seite als Revision gespeichert wird. Ich könnte mit einer Flagge im Page-Modell herumspielen und 'has_unpublished_changes'. Entweder in dem von Ihnen erwähnten Hook oder im 'page_published' Signal. –

0

Hier ist die Art, wie ich es jetzt umgesetzt haben:

# 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)  

Bisher dies tut, was ich will. Die Implementierung erfolgt jedoch (noch) nicht über die ready() Methode der App. Ich werde sehen, ob das irgendwelche Auswirkungen hat ...

0

Für bereit() Fluss können Sie signal.py in Ihrem App-Verzeichnis erstellen und Ihre Empfängerlogik darin einfügen.

Dann können Sie in Ihrer app.py die ready() Methode verwenden, um diese Signale zu initialisieren.

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

    def ready(self): 
     from . profiles import signals 
Verwandte Themen