Question

Je suis un développeur d'extrémité avant, et je l'ai essayé d'obtenir un blocage sur l'utilisation Jinja2 efficacement. Je veux modifier un site en cours de sorte qu'il a plusieurs modèles de base en utilisant l'héritage, il utilise entièrement les balises de bloc pour remplacer le contenu et la remplacer, et utilise des macros pour soutenir le passage des arguments.

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 l'étends ressemble à 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 passer des arguments à cette macro. Je ne comprends pas tout à fait tout, 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: il donne un certain degré de flexibilité et de puissance. Encore une fois cela est fortement simplifiée.

Le seul problème est, ce nie ma capacité à utiliser des blocs. Les macros sont la flexibilité, mais avec des blocs, j'ai la possibilité de remplacer quelque chose de tout, ou utiliser le contenu des parents de et ajouter à cela, que je ne peux pas faire avec des macros (au moins je ne pense pas). Le problème est, je ne peux pas envelopper les choses dans les blocs, sinon ils ne verront pas les valeurs dans la macro. Par exemple, faire ceci:

{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}

échouera car il dira le titre est indéfini.

En fin de compte, je suis à la recherche d'un moyen d'utiliser à la fois la puissance et les aspects organiztional des blocs, mais être en mesure d'utiliser la logique et laconisme des macros. Si quelqu'un pouvait me donner une aide à la façon dont je pourrais aller sur ce problème, je voudrais vraiment l'apprécier.

Était-ce utile?

La solution

Les blocs ne sont définissables au plus haut niveau d'un modèle. Si vous étendez un modèle, toutes les valeurs définies dans le modèle d'enfant à l'aide d'une balise set sera accessible à partir du modèle qu'elle prolonge. 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 %}

Ensuite, la référence à title dans le parent résoudrait à 'Homepage'. Vous pouvez le faire avec tout type de variable. Pour ce que vous faites, je ne pense pas qu'il y ait besoin de macros - si vous prenez avantage de cette fonctionnalité et place des blocs bien, vous serez en mesure de faire à peu près tout que vous devez faire pour autant que mises en page sont concernés . Je regardais quelques-uns 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 fonctions de jinja2.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top