2017-09-02 2 views
0

Avec Wagtail CMS, quelle est la meilleure façon d'imiter la fonctionnalité "Plugin" de Django CMS?Existe-t-il un moyen d'utiliser les fragments Wagtail pour afficher les modèles Django existants?

Dans Django CMS, je suis en mesure d'écrire un custom plugin qui peut afficher un modèle et toutes les informations connexes à ce modèle. Les gestionnaires de contenu peuvent ensuite ajouter ce plugin à un espace réservé n'importe où sur le site. Avec Wagtail, la chose la plus proche que je peux trouver est le Snippet, mais chaque fois que vous utilisez le Snippet, vous devez l'inclure spécifiquement dans le modèle Page.

Prenez ces deux modèles par exemple:

class Pet(models.Model): 
    species = models.CharField(max_length=10) 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.CharField(max_length=100) 

Pour le gestionnaire de contenu pour pouvoir accéder à ces que je avais besoin de les enregistrer sous forme d'extraits, puis la liste de chaque modèle dans le modèle de cette page comme ceci:

class HomePage(Page): 
    content_panels = Page.content_panels + [ 
     SnippetChooserPanel('pet'), 
     SnippetChooserPanel('book'), 
    ] 

Y a-t-il une meilleure façon de le faire avec Wagtail?

Répondre

1

Pour réaliser ce type de solution sans définir de modèle, vous pouvez regarder l'approche StreamField.

Vous pouvez définir un type de bloc StreamField personnalisé qui modélise pets ou books. Rendez-le disponible sur les pages qui en ont besoin, vous devez toujours être explicite sur les pages qui peuvent utiliser ce StreamField.

Vous pouvez alors définir un modèle personnalisé qui rend ces articles, dans la documentation:

http://docs.wagtail.io/en/v1.12.1/topics/streamfield.html#template-rendering

+0

Marqué comme la bonne réponse. Confirme mon hypothèse que les extraits doivent être explicitement déclarés. Je vous remercie. –

0

Pour réaliser ce genre de solution avec un modèle générique défini, vous pouvez définir une méthode à la fois la Book et Pets classes.

Quelque chose comme:

from django.template.loader import render_to_string 
from django.utils.safestring import mark_safe 


class Book(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.CharField(max_length=100) 
    template = 'path/to/template.html' 

    get_as_html(self): 
     return mark_safe(render_to_string(self.template, {'self': self})) 

Vous devez créer le fichier modèle qui gère l'instance du livre. Cela signifie que vous pouvez facilement appeler {{ Book.get_has_html }} dans tous les modèles qui utilisent l'extrait de livre.