Recherche modèle lié Mezzanine

29 Fév

J'ai eu besoin pour un projet développé avec mon CMS préféré Mezzanine, d'ajouter un modèle lié dans la liste de recherche, je me suis donc posé la question comment faire ? dans la documentation rien n'est spécifié, mais comme Mezzanine est basé sur le framework Django, je n'ai pas eu à chercher trop longtemps c'était assez logique

Modèle lié orderable

Alors pour commencer j'ai un modèle PageMenu héritant du modèle page de mezzanine permettant de bénéficier des différentes méthodes de son parent et de pouvoir être affiché dans la navigation des pages

 class PageMenu(Page, RichText):

""" Page menu """
    content = RichText(_('Contenu'))
    objects = SearchableManager()
    search_fields = ("menus__title", "menus__category")
    class Meta:
      verbose_name = _("Page menu")
      verbose_name_plural = _("Pages menu")  

Ce qui est important ici c'est l'attribut search_fields qui permet en suivant la documentation d'ajouter des champs de recherche

Voici le modèle lié Menu qui hérite de la classe Orderable permettant ainsi de les réorganiser facilement

class Menu(Orderable):

""" Menus """
  pagemenu = models.ForeignKey(PageMenu, related_name="menus", null=True, blank=True)
  title = models.CharField(verbose_name=_("Titre"), max_length=120)
  image = FileField(verbose_name=_("Image"),
  upload_to=upload_to("theme.Promo.image", "promotions"), format="Image", max_length=255, null=True, blank=True)
  description = models.TextField(verbose_name=_('Description'), help_text=_("Ajouter les ingrédients ou autres"), null=True, blank=True)     price = models.FloatField(verbose_name=_("Prix"), null=True, blank=True, help_text=_("Insérer du plat"))
  category = models.CharField(verbose_name=_("Catégorie"), max_length=120, null=True, blank=True, help_text=_( "Texte qui sera   afficher avant les plats, permet de grouper les plats par catégories par exemple"))
  new = models.BooleanField(verbose_name=_("Nouveauté"), help_text=_("Ajoute une icône new"), default=False) 

Ce que je veux, c'est pouvoir réaliser une recherche sur le titre et les catégories de mon modèle lié et non pas sur le modèle parent, il suffit juste d'initialiser l'attribut search_fields dans le modèle parent et d'utiliser la recherches traversant les relations en spécifiant le nom du modèle enfant  avec  2 tirets " __" et son champ:

search_fields = ("menus__title", "menus__category") # menus et le modèle enfant renommer avec related_name et title et category les champs ciblés

 Voillà pour la petite astuce 

Publié le: Lundi 29 février 2016
blog comments powered by Disqus
Monter

© Circonflex-studio - Tous droits réservés - Mentions legales
Développeur web indépendant / Webdesigner / Intégrateur
Nice - Cannes - Monaco - Antibes - côte d'azur | site valide HTML 5

Ce site à été développé en Python avec le framework Django

"http://www.cssawards.net/nominee/circonflex-studio/"