Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gabarits inopérents avec Django

Sujet résolu
    18 décembre 2021 à 23:50:54

    Bonjour,

    Je suis en train de développer un site internet sous Django pour mon plus grand plaisir. Cependant, je suis incapable d'utiliser les gabarits : je n'arrive pas à faire en sorte que Django se comporte comme je le souhaite. Je m'explique.

    J'ai un fichier base.html dans lequel vous pouvez trouver :

    ...
    <head>
        {% block header %}{% endblock %}
    </head>
    ...

    Et un autre fichier html situé dans le même dossier (à savoir templates/le_nom_de_l_application/) qui contient :

    {% extends 'le_nom_de_l_application/base.html' %}
    
    {% block header %}
    
        Le code html, conséquent, à insérer.
    
    {% endblock %}

    Or, lorsque je regarde le code source de la page dans mon navigateur, je vois :

    ...
    <head>
    
    </head>
    ...

    Ce qui est embêtant, puisque le code html n'a pas été injecté.

    Quelqu'un aurait-il une idée du problème et de comment le résoudre ?

    Au plaisir de vous lire,

    PN.



    • Partager sur Facebook
    • Partager sur Twitter
      19 décembre 2021 à 14:02:16

      Salut,

      Il faut nommer le endblock, c'est-a-dire:

      ...
      <head>
          {% block header %}{% endblock header %}
      </head>
      ...

      -
      Edité par Aorgetos 19 décembre 2021 à 14:03:22

      • Partager sur Facebook
      • Partager sur Twitter
      Nil desperandum
        19 décembre 2021 à 16:06:55

        Bonjour,

        Tout d'abord, merci pour votre réponse. J'ai effectué la modification, mais elle n'a eu aucun effet, le code html n'est toujours pas injecté.

        • Partager sur Facebook
        • Partager sur Twitter
          19 décembre 2021 à 17:40:44

          Bonjour,

          Dans ce cas il faut essayer une autre solution:

          1) dans settings.py indiquer ou se trouve le dossier de templates:

          TEMPLATES = [
              {
                  ...
                  'DIRS': [BASE_DIR / 'templates'], # par exemple
                   ...

          2) Dans la child template, quand vous faites importation de base.html, n'indiquez pas le chemin complet. Il suffit d’écrire de la sorte:

          {% extends 'base.html' %}

          Espérons que cette fois tout marchera bien. Qui ne fait rien, ne casse rien.



          -
          Edité par Aorgetos 19 décembre 2021 à 17:41:30

          • Partager sur Facebook
          • Partager sur Twitter
          Nil desperandum
            19 décembre 2021 à 20:37:19

            Le ligne dans settings.py qui indique le dossier est déjà remplie de la sorte. Je vais détailler un peu plus la structure du projet.

            Celui-ci (qui se nomme applications) est composé de deux applications, à savoir app1 et app2. On a donc :

            applications

                  |- applications

                            |- ...

                            |- settings.py

                            |- ...

                  |- app1

                  |- app2

                  |- static

                  |- templates

                            |- app1

                                   |- des fichiers html

                            |- app2

                                   |- des fichiers html

                  |- ...

            D'où les chemins indiqués dans mon premier message.

            La partie du fichier de configuration qui concerne les templates :

            ...
            
            BASE_DIR = Path(__file__).resolve().parent.parent
            
            ...
            
            TEMPLATES = [
                {
                    'BACKEND': 'django.template.backends.django.DjangoTemplates',
                    'DIRS': [BASE_DIR / 'templates']
                    ,
                    'APP_DIRS': True,
                    'OPTIONS': {
                        'context_processors': [
                            'django.template.context_processors.debug',
                            'django.template.context_processors.request',
                            'django.contrib.auth.context_processors.auth',
                            'django.contrib.messages.context_processors.messages',
                        ],
                    },
                },
            ]
            
            ...

            A priori rien d'étonnant ici.

            Mais le problème demeure.

            • Partager sur Facebook
            • Partager sur Twitter
              20 décembre 2021 à 8:38:39

              Tout semble correct.

              Si quand vous affichez un fichier html avec la balise {% extends 'base.html' %} en tête et n'obtenez pas le message d'erreur TemplateDoesNotExist, alors ce n'est plus le problème de chemin, mais plutôt du code à injecter.

              Pour le développement je vous conseille d'installer django-debug-toolbar (voir les docs pour cela). C'est un outil incontournable. Entre d'autre choses il permet de voir les templates chargées.

              • Partager sur Facebook
              • Partager sur Twitter
              Nil desperandum
                20 décembre 2021 à 15:28:04

                Je n'ai en effet pas de telles erreurs lorsque j'affiche un fichier html avec la balise {% extends 'base.html' %} en tête. En revanche, j'obtiens le fichier base.html contenant le code html du fichier avec la balise {% extends 'base.html' %} au bon endroit.

                Suite à votre conseil, j'ai installé django debug toolbar. Lorsque j'affiche les informations concernant les gabarits, il y a notamment indiqué : Template paths : aucun. Cela a-t-il un rapport avec le problème rencontré ?

                • Partager sur Facebook
                • Partager sur Twitter
                  20 décembre 2021 à 18:06:40

                  En effet, ce n'est pas normal que le message dit: Template paths : aucun, alors que le chemin est indiqué dans le settings.py  comme suit: 

                  'DIRS': [BASE_DIR / 'templates']

                  Et dans la page sur les informations concernant les gabarits est-il écrit Templates (2 rendered), ou 1 seule template?

                  Vous utilisez quelle version de Django?

                  -
                  Edité par Aorgetos 20 décembre 2021 à 18:15:12

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Nil desperandum
                    20 décembre 2021 à 20:03:22

                    Il est écrit Templates (1 rendered). J'utilise la version 4.0.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 décembre 2021 à 9:16:47

                      J'ai déjà eu pas mal de soucis avec la version 4.0, pour l'instant il serait préférable de rester en version 3.x

                      Le problème n'est pas tant la version de Django, mais les modules dépendants qui n'ont pas forcément suivi le framework dans leur mise à jour.

                      La version de Django 4.0 est stable, mais mieux vaut prendre la version 3.2.10 même si le problème persiste, c'est un conseil.^^

                      -
                      Edité par fred1599 21 décembre 2021 à 9:17:03

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                        21 décembre 2021 à 18:19:26

                        Je n'ai pas eu le temps de tester ce défit avec Django 4. J'ai parcouru les docs de cette version concernant les templates et n'ai pas constaté une nouvelle logique par rapport aux versions précédentes de Django. Très curieux problème. Faites des essais avec des pages très simples.

                        Le conseil de fred1599 est très judicieux. 

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Nil desperandum

                        Gabarits inopérents avec Django

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        • Editeur
                        • Markdown