Je suis un développeur frontal, et j'ai essayé de me débrouiller avec Jinja2 efficacement. Je souhaite modifier un site actuel afin qu'il utilise plusieurs modèles de base à l'aide de l'héritage. Il utilise entièrement des balises de bloc pour remplacer le contenu et le remplacer, et utilise des macros pour prendre en charge le transfert d'arguments.Dans Jinja2, comment puis-je utiliser des macros en combinaison avec des balises de bloc?
Mon modèle de base contient ce code (modifié pour simplifier):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
{% from "foo.html" import macro1, macro2, macro3 %}
{% macro base_template(title=none, arg2=none, urls={}, arg3=false) %}
<html>
<title>{{ title }} | Site.com</title>
....
{{ caller() }}
....
</html>
{% endmacro %}
{% block content %}{% endblock %}
Et mes pages qui se prolongent ressembler à ceci:
{% extends "base.html" %}
{% block content %}
{% call base_template(title="home", arg2="active", arg3="true") %}
(html code here)
{% endcall %}
{% endblock %}
Donc, fondamentalement, toutes les pages étendent la base, ils appellent une macro et passez les arguments à cette macro. Je ne comprends pas tout à fait, mais le point principal est que cela permet des valeurs par défaut et un degré de flexibilité qui ne nécessite pas de redéfinir un bloc entier: cela donne un certain degré de flexibilité et de puissance. Encore une fois, cela est fortement simplifié.
Le seul problème est, cela nie ma capacité à utiliser des blocs. Les macros sont pour la flexibilité, mais avec des blocs, j'ai la possibilité de remplacer complètement quelque chose, ou d'utiliser son contenu parent et de l'ajouter, ce que je ne peux pas faire avec les macros (du moins je ne pense pas). Le problème est, je ne peux pas envelopper les choses dans des blocs, sinon ils ne verront pas les valeurs dans la macro. Par exemple, en faisant ceci:
{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}
Échec parce qu'il dira que le titre est indéfini.
Finalement, je suis à la recherche d'un moyen d'utiliser à la fois la puissance et les aspects organisationnels des blocs, mais toujours être en mesure d'utiliser le & logique de macros. Si quelqu'un pouvait m'aider à résoudre ce problème, je l'apprécierais vraiment.
Je vais essayer cela maintenant, même si cela fonctionne bien ou non, merci pour l'aide, appréciez-le beaucoup. Aller à regarder définitivement le lien bitbucket que vous avez fourni aussi bien. – xckpd7
Wow, vous n'avez absolument aucune idée de combien cela m'a aidé. Je suis maintenant en mesure d'utiliser des blocs en tant que commande maîtresse, mais j'ai des variables définies dans ma base, et je peux définir un dictionnaire pour remplacer l'un d'entre eux, exactement ce que je voulais. Merci pour votre aide! – xckpd7