2010-01-20 2 views
10

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.

Répondre

20

Les blocs ne peuvent être définis qu'au niveau supérieur d'un modèle. Si vous étendez un modèle, toutes les valeurs définies dans le modèle enfant à l'aide d'une balise set seront accessibles à partir du modèle qu'il étend. Par exemple, si vous avez un modèle nommé layout.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <title>{{ title }} | Site.com</title> 
    .... 
    {% block content %}{% endblock content %} 
    .... 
</html> 

Et vous avez ce modèle enfant, index.html:

{% extends "layout.html" %} 
{% set title = 'Homepage' %} 
{% block content %} 
(html code here) 
{% endblock content %} 

la référence à title dans le parent résoudrait à 'Homepage'. Vous pouvez le faire avec n'importe quel type de variable. Pour ce que vous faites, je ne pense pas qu'il y ait besoin de macros - si vous profitez de cette fonctionnalité et placez des blocs bien, vous serez capable de faire à peu près tout ce que vous devez faire en ce qui concerne les dispositions. . Je voudrais regarder certains des modèles utilisés par Plurk Solace, qui est écrit par l'un des auteurs Jinja2, si vous voulez avoir une bonne idée de quand utiliser diverses fonctionnalités de Jinja2.

+1

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

+0

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

Questions connexes