web-dev-qa-db-fra.com

django inclure le modèle d'une autre application

Lors de la configuration de mon projet et de la conservation des applications non dépendantes, j'ai rencontré un problème. J'aimerais que tous les modèles des différentes applications aient un en-tête et un pied de page cohérents. Voici ce que j'essaie:

myproject/
         base/
             templates/
                      header.html
                      footer.html
         app1/
             templates/
                      my_app1_page.html -> want to include 'header.html'
                                           and 'footer.html' from base app

Imaginez qu'il existe de nombreuses autres applications qui souhaitent également le faire. Est-ce possible et/ou la bonne façon de le faire?

56
Scott

Tant que les applications sont dans INSTALLED_APPS et que le chargeur de modèles pour les répertoires des applications est activé, vous pouvez inclure n'importe quel modèle d'une autre application, à savoir:

{% include "header.html" %}

... puisque vos modèles se trouvent directement dans le répertoire des modèles de votre application. En règle générale, afin d'éviter les conflits de noms, il est préférable d'utiliser:

app1/
    templates/
        app1/
            page1.html
            page2.html
app2/
    templates/
        app2/
            page1.html
            page2.html

Et {% include "app1/page1.html" %} ou {% include "app2/page1.html" %} ...

Mais: pour conserver une apparence cohérente, il est tellement préférable d'utiliser l'héritage de modèle plutôt que l'inclusion. L'héritage des modèles est l'un des vraiment de bonnes choses du système de modèles Django, choisissez l'héritage plutôt que l'inclusion chaque fois que cela a du sens (la plupart du temps).

Mes recommandations:

  • Avoir un modèle de base pour votre projet ("base.html" est la convention par défaut) avec en-tête et pied de page et un {%block content%} pour votre contenu principal.
  • Demandez à vos autres modèles d'hériter du formulaire base.html {% extends "base.html" %} et remplacer la section de contenu

Voir une autre réponse à cette question pour les liens vers le doc

91
Carles Barrobés

Bien que vous puissiez certainement le faire en utilisant include tag et en spécifiant des chemins absolus, la bonne façon de travailler dans Django est d'utiliser héritage de modèle =.

9
Tiago