Django template tag dynamique template
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