103 votes

Modèles Django: inclure et étendre

Je tiens à fournir le même contenu à l'intérieur de 2 différents fichiers de base.

Donc, je suis en train de faire ceci:

page1.html:

{% extends "base1.html" %}
{% include "commondata.html" %}

page2.html:

{% extends "base2.html" %} 
{% include "commondata.html" %}

Le problème est que je n'arrive pas à utiliser à la fois les prolonge et les comprennent. Est-il un moyen de le faire? Et si non, comment puis-je y arriver?

commondata.html remplace un bloc qui est spécifié dans les deux base1.html et base2.html

Le but de cette opération est de fournir la même page dans les deux formats pdf et html, où la mise en forme est légèrement différente. La question ci-dessus mais simplifie ce que je suis en train de le faire si je peux obtenir une réponse à qui il permettra de résoudre mon problème.

105voto

bigmattyh Points 9167

Lorsque vous utilisez l'étend balise de modèle que vous êtes en train de dire que le modèle actuel s'étend à l'autre-que c'est un enfant modèle, dépend d'un modèle parent. Django va regarder votre enfant modèle et utiliser son contenu pour remplir le parent.

Tout ce que vous voulez utiliser dans un template enfant doit être à l'intérieur des blocs, Django utilise pour remplir le parent. Si vous souhaitez utiliser une instruction include dans cet enfant modèle, vous devez le mettre à l'intérieur d'un bloc, pour Django de lui donner un sens. Sinon, il n'a tout simplement pas de bon sens et de Django ne sais pas quoi faire avec elle.

La documentation de Django a un peu de vraiment de bons exemples de l'utilisation de blocs de remplacer les blocs dans le modèle parent.

http://docs.djangoproject.com/en/dev/topics/templates/#template-inheritance

76voto

podshumok Points 611

De Django docs:

Le tag doit être considérée comme une mise en œuvre de "rendre cette tête et inclure le code HTML", et non "à analyser cette tête et ajouter son contenu comme s'il faisait partie de la société mère". Cela signifie qu'il n'est pas un état partagé entre les modèles inclus -- comprennent chacun est complètement indépendant processus de rendu.

Donc, Django ne pas saisir tous les blocs à partir de votre commondata.html et il ne sait pas quoi faire avec le rendu html à l'extérieur des blocs.

12voto

Net Citizen Points 1053

Plus d'informations sur les raisons pour lesquelles cela n'a pas fonctionné pour moi au cas où cela aiderait les personnes futures:

La raison pour laquelle cela ne fonctionnait pas, c'est que {% include%} dans django n'aime pas les caractères spéciaux, tels que les apostrophe sophistiqués. Les données de modèle que j'essayais d'inclure ont été collées à partir de word. Je devais supprimer manuellement tous ces caractères spéciaux et ensuite il a été inclus avec succès.

3voto

emery Points 11

Vous ne pouvez pas tirer dans les blocs à partir d'un fichier inclus dans le modèle pour remplacer le parent du modèle de blocs. Cependant, vous pouvez spécifier un parent dans une variable et d'avoir le modèle de base indiqués dans le contexte.

À partir de la documentation:

{% extends variable %} utilise la valeur de la variable. Si la variable prend la valeur d'une chaîne de caractères, Django utilisera cette chaîne comme le nom du modèle parent. Si la variable prend la valeur d'un objet de Modèle, Django va utiliser l'objet comme le modèle parent.

Au lieu de séparer "page1.html" et "page2.html" {% extends base_template %} au sommet de la "commondata.html". Et puis, à votre avis, définissent base_template "base1.html" ou "base2.html".

2voto

Ted Points 1886

Ajouté pour référence aux futurs utilisateurs qui trouvent ceci via Google: Vous pouvez consulter la balise {% overextend%} fournie par la bibliothèque mezzanine pour des cas comme celui-ci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X