7
votes

Django: Impossible de passer une variable au modèle inclus?

J'ai eu un problème où je veux utiliser un modèle, y compris dans Django.

Voici le réel exemple: J'ai 3 fichiers: p>

  • home.html strong> (obtiendra la variable de contexte passée de vues strong>) li>
  • base.html strong> (le fichier de modèle de squelette) li>
  • et le Header HTML strong> (inclus par base.html). LI> ul>

    Si je mets le code ci-dessous directement dans base.html strong> sans y compris Header.html strong>, le {{title}} forte > La variable passée de la maison est correctement appelée. Mais si j'inclus l'en-tête Header.html fort> dans base.html strud>, la valeur de la variable {{title}} forte> ne peut pas être appelée. P>

    <title>{% block title %}{% endblock %} | {{ SITE_INFO_TITLE }}</title>
    


4 commentaires

Travaille pour moi dans la façon dont j'ai compris la question. Pouvez-vous donner des exemples minimaux des trois modèles qui causent le problème?


Voici l'exemple: la base.html qui inclut le Header.html à l'aide de {% Inclure "Header.html"%}. Le Header.html contient le code ci-dessus {% bloquer titre%} {% endblock%} | {{Site_info_title}} pour la génération de titres dynamique. Le home.html (et d'autres fichiers de modèle pour blog et pages) qui transmettront sa valeur de titre (par exemple, context = {'Titre': "Bienvenue dans la page d'accueil de mon entreprise",}) via le contexte ( placé sous des vues).


Je ne vois toujours pas ce que le problème est. Pourquoi est-ce {{site_info_title}} dans le modèle mais 'Titre': "Bienvenue ..." dans le contexte de rendu ??


{{Site_info_title}} est une variable statique dans mes paramètres Conf (p. Ex. Société XYZ), tandis que la variable "Titre" sera attribuée de manière dynamique via des vues. Par exemple. Lors de la visualisation d'un poste avec le titre "Hello World", le titre complet de la page sera: 'Hello World | Société XYZ '


3 Réponses :


4
votes

Autant que je connaisse des blocs et une variable sont distincts à Django. Si vous souhaitez transmettre le titre en tant que variable de contexte, vous devez la définir à l'aide d'une déclaration de base.html telle que: xxx

, qui contient: xxx < / Pré>

Vous pouvez également la définir à la maison comme ceci.
{% Bloquer titre%} Page d'accueil {% EndBlock%} Mais j'essaie aussi de mettre dans le contexte du modèle. Sans le bloc de titre. xxx

Je pense que vous pouvez également voir le avec la balise de modèle , je pense qu'il est possible de définir une variable de contexte à l'aide de cette balise .


3 commentaires

En réalité, mettre le snippet {% bloquer titre%} {{title}} {% endblock%} ci-dessus dans le modèle enfant a plus de sens. Dans mon cas, le code précédent devrait être invoqué dans la variable home.html de sorte que la variable {{title}} sera définie via le contexte. Ai-je raison?


@duy cela dépend de ce que vous voulez. En fait, mes modèles base.html sont plus complexes que les feuilles une, peut-être que le titre d'extrait de titre est dans Header.html dans votre cas.


Oui, tu as raison comme je pense aussi la même chose. Le problème est que lorsque nous passons la variable de contexte à un modèle inclus (modèle enfant), il ne peut pas être attribué. Peut-être que c'est un problème logique.



4
votes

Vous pouvez utiliser Tags Inclusion pour rendre un modèle supplémentaire à partir d'un modèle Django. Vous pouvez également transmettre le contexte de modèle "enfant" à partir du modèle "Parent".

C'est un peu impliqué pour votre cas d'utilisation, mais cela résout votre problème. J'ai tendance à l'utiliser quand je bouge une liste pour rendre chaque élément avec un modèle personnalisé. Je peux ensuite réutiliser ce modèle ailleurs sans dupliquer le balisage si j'ai besoin de rendre un autre élément du même type.


1 commentaires

hum ... Si cela résout mon problème, je doute si les balises d'inclusion pouvaient être plus dynamiques afin que le titre de mon page soit généré différemment dans le cas d'un blog où le titre de la page de chaque message est différent (Post.tiTle est transmis à la {{titre}} variable)? Et les balises d'inclusion semble être liée à des modèles (la balise doit être définie dans la classe de modèle), donc si je veux l'utiliser dans un contexte non modèle (comme le titre de la page d'accueil - qui implique une vue et un modèle) I Don 't sais si cela pourrait aider. BTW, j'apprends les étiquettes d'inclusion via votre lien. Merci.



12
votes

Pourriez-vous simplement transmettre une variable dans le {% inclure%} code> étiquette? Il est documenté ici: https://docs.djangoproject.com/fr/1.5/ref/templates / Construits / # Inclure

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}


0 commentaires