Django template tag dynamique template

31 Mai

Lors du développement de vos projets avec le framework Django, vous utilisez très souvent les templates tags qui permettent une réutilisation du code dans vos templates, si vous ne connaissez tout est expliqué dans la documentation

Quand vous utilisez  un tag inclusion avec le raccourci @register.inclusion_tag('results.html') par exemple, Ce tag permet d'inclure un résultat d'un queryset ou autres dans le template passé en paramètre. Jusqu'ici pas très compliqué, mais voilà pour coller le plus aux conventions DRY (don't repeat yourself) si nous voulons que la logique de notre tag puisse être utilisée dans un autre template, et bien avec le raccourci ci-dessus nous ne pouvons pas à moins de dupliquer le code.

Utiliser simple tag

La solution consiste à utiliser le raccourci simple tag ex: @register.simple_tag(takes_context=True) et de faire passer en paramètre le nom du template, voici un exemple:

@register.simple_tag(takes_context= True)

def search_engine(context, template_name) # template_name le nom du template passé
    queryset = Model.objects.all()
     ....
    t = loader.get_template(template_name) # On charge le template manuellement
    return t.render(Context({"results": queryset}) # On utilise la function render pour ajouter au context le queryset à afficher dans le template

Tout est dans les commentaires, pour résumer au lieu d'utiliser le raccourci pour le tag inclusion, nous utilisons celui de simple tag et fait appel directement au template manuellement, maintenant nous avons un genre de tag inclusion mais avec un appel dynamique du template qui nous permettra plus de flexibilité lors de l'utilisation de nos tags

Publié le: Mercredi 31 mai 2017
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/"