Je voudrais fournir le même contenu dans 2 fichiers de base différents.
J'essaye donc 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 extensions et les inclusions. Y a-t-il un moyen de faire cela? Et sinon, comment puis-je accomplir ce qui précède?
commondata.html remplace un bloc spécifié à la fois dans base1.html et base2.html
Le but est de fournir la même page au format pdf et html, où le formatage est légèrement différent. La question ci-dessus simplifie cependant ce que j'essaie de faire, si je peux obtenir une réponse, cela résoudra mon problème.
la source
À partir de la documentation Django:
Donc Django ne récupère aucun bloc de votre commondata.html et il ne sait pas quoi faire avec les blocs extérieurs html rendus.
la source
Cela devrait faire l'affaire pour vous: mettez la balise include à l'intérieur d'une section de bloc.
page1.html:
page2.html:
la source
Plus d'informations sur les raisons pour lesquelles cela ne fonctionnait pas pour moi au cas où cela aiderait les futures personnes:
La raison pour laquelle cela ne fonctionnait pas est que {% include%} dans django n'aime pas les caractères spéciaux comme l'apostrophe fantaisie. Les données du modèle que j'essayais d'inclure ont été collées à partir de Word. J'ai dû supprimer manuellement tous ces caractères spéciaux, puis ils ont été inclus avec succès.
la source
Vous ne pouvez pas extraire des blocs d'un fichier inclus dans un modèle enfant pour remplacer les blocs du modèle parent. Cependant, vous pouvez spécifier un parent dans une variable et avoir le modèle de base spécifié dans le contexte.
De la documentation :
Au lieu de séparer «page1.html» et «page2.html», placez-
{% extends base_template %}
le en haut de «commondata.html». Et puis, à votre avis, définissezbase_template
comme étant "base1.html" ou "base2.html".la source
Ajouté pour référence aux futures personnes qui trouveront cela via google: vous pouvez consulter la balise {% overextend%} fournie par la bibliothèque mezzanine pour des cas comme celui-ci.
la source
Edit 10 décembre 2015 : Comme indiqué dans les commentaires, ssi est obsolète depuis la version 1.8. Selon la documentation:
À mon avis, la bonne (meilleure) réponse à cette question est celle de podshumok , car elle explique pourquoi le comportement d'inclure lorsqu'il est utilisé avec l'héritage.
Cependant, j'ai été quelque peu surpris que personne n'ait mentionné la balise ssi fournie par le système de modèles Django, qui est spécialement conçu pour inclure un texte externe en ligne . Ici, en ligne signifie que le texte externe ne sera pas interprété, analysé ou interpolé, mais simplement "copié" à l'intérieur du modèle appelant.
Veuillez vous référer à la documentation pour plus de détails (assurez-vous de vérifier votre version appropriée de Django dans le sélecteur en bas à droite de la page).
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi
De la documentation:
Méfiez-vous également des implications de sécurité de cette technique et également de la définition ALLOWED_INCLUDE_ROOTS requise, qui doit être ajoutée à vos fichiers de paramètres.
la source