Django-fr

Forum

  • Accueil
  • » Django-fr
  • » Template extends ne marche pas (bug ou incomprehension)

#1 30-12-2014 17:08:17

razer
Membre
Inscription : 30-12-2014
Messages : 2

Template extends ne marche pas (bug ou incomprehension)

Bonjour,

Je viens de passer 6 h montre en main à essayer de faire fonctionner les extends de template, sans succès
Par dépit, je poste un message ici

Afin d'éliminer tout ambiguité, je suis reparti d'un nouveau projet django copiant totalement l'exemple fourni dans le tutoriel de django.
J'ai donc créé un projet "mysite" dans lequel j'ai crée un site 'polls"

voici les fichiers édités, selon donc le tutoriel
Les chemins des fichier commencent bien sur par le chemin de mon projet "mysite"

Dans mysite/settings.py ::

...
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]
INSTALLED_APPS = (
     ...
    'polls',
)
...

Dans mysite/urls.py :

...
urlpatterns = patterns('',
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', include(admin.site.urls)),
)
...

Dans polls/models.py :
Les models sont ceux du tutoriel (de toute manière, ils ne servent à rien pour l'essai)


idem dans polls/url.py (copié/collé) :

from django.conf.urls import patterns, url
from polls import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
)

polls/views.py :

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse
from django.template import RequestContext, loader
from polls.models import Question

def index(request):
    null = False
    template = loader.get_template('polls/index.html')
    context = RequestContext(request, {
        'null': null,
    })
    return HttpResponse(template.render(context))

dans polls/templates/polls/index.html :

<!DOCTYPE html>
<html lang="en">
<head>
</head>

<body>
        {% block content %}extends is not working{% endblock %}
</body>
</html>

dans polls/templates/polls/index_content.html :

{% extends "index.html" %}

{% block content %}
    <h2>Extends is working</h2>
{% endblock %}

Et 7h que j'essaye tout et rien, jamais vu le "extends is working" ou n'importe quel autre contenu stocké dans le fichier précisant l'extends

Donc, soit j'ai toujours rien compris après 1000 lectures de la doc correspondant et autant d'opérations, soit je suis face à un bug
Ma version de django et 1.7.1, sur une arch/Linux

Merci par avance de votre aide

Hors ligne

#2 30-12-2014 18:15:49

phild
Membre
Inscription : 30-12-2014
Messages : 1

Re : Template extends ne marche pas (bug ou incomprehension)

Bonjour,

Il faut voir le tag {% extends %} comme l'extension au sens POO du terme : le template parent sert de base que le fils spécialise. Dit autrement, et pour reprendre tes noms de fichiers, comme index_content.html étend index.html, tu peux considérer que index_content.html EST UN index.html, auquel on a ajouté des choses (dans les blocks).

Par conséquent, ton problème est dans ta vue :

template = loader.get_template('polls/index.html')

Ici, tu charges le template parent, pas l'enfant (c'est comme si tu utilisais la classe parente d'un objet, au lieu d'utiliser la classe fille). Remplace donc cette ligne par :

template = loader.get_template('polls/index_content.html')

Tu auras un autre problème de recherche de template, qui se corrigera en remplaçant ton extends par cette ligne :

{% extends "polls/index.html" %}

Puis ce sera bon, tu verras ce que tu attends depuis des heures.


Maintenant, le vrai problème, c'est que tu as confondu les concepts d'inclusion et d'héritage de template :

  • l'extension marche comme dit plus haut, c'est comme en POO : tu prends un template de base, qui a déjà son propre comportement (i.e. son propre contenu), et tu en spécialises certaines parties (i.e. tu remplis des blocks). Au passage, ça veut dire que tes fichiers sont mal nommés : il faut que tu renommes index_content.html en quelque chose comme specialized_index.html.

  • l'inclusion est ce que tu sembles avoir essayé de faire ici : tu insères dans un template le contenu d'un autre template. Et pour faire ça, la bonne syntaxe n'utilise pas d'{% extends %} :


index.html

<!DOCTYPE html>
<html lang="en">
<head>
</head>

<body>
        {% include 'polls/index_content.html' %}
</body>
</html>

index_content.html

<h2>Extends is working</h2>

@+
Philippe

Hors ligne

#3 31-12-2014 00:10:44

razer
Membre
Inscription : 30-12-2014
Messages : 2

Re : Template extends ne marche pas (bug ou incomprehension)

Un grand merci d'avoir pris le temps de me répondre
Il se trouve que j'avais 'enfin' compris la subtilité du truc avant de te lire

Je ne sais pas si je suis particulièrement bête ou tordu, il n'empêche que je ne comprend pas souvent la doc django (et les technos web en général), et quand j'arrive enfin à comprendre je trouve le fonctionnement totalement anti-logique

Cà fait 20 ans que je bricole du dev logiciel, que je programme des controleurs, que j'administre des réseaux complexes sur des archi diverses (linux, bsd...)

Dès que je touche au webdev, j'ai l'impression d'être un attardé. J'ai l'impression que tout est complètement tordu, le javascript en tête : j'ai bricolé des extensions gnome-shell avec ce truc, j'ai cru pleurer

Là, avec django, c'est simple : à chaque fois que j'essaye de faire un truc mega-simple je passe 10 heures avant d'y arriver
Pour exemple, j'essaye de créer un lien accessible via un input form, dans la racine de mon site django, j'ai beau renseigner le url.py comme je pense correctement, et biensur çà ne marche pas :

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^/ping/$', views.ping, name='ping'),
)

dans mon template, j'ai un truc du genre :

<form action="ping" method="post">{% csrf_token %}
                    <input type="submit" name="ping" value="Mettre à jour maintenant" id="button">
               </form>

çà ne marche pas, Page not found (404) si j'essaye monsite.com/monprojet/ping (alors que monsite.com/monprojet renvoie vers ma function index() dans le views.py
Je suis pas tellement étonné, vu que je n'y comprends rien

Le pire, c'est que je viens de me paner une librairie complète pour gérer des modules radio en zigbee (représentant des objets connectés), en me tapant de l'encodage/décodage de trames et autre joyeusetés. Je me croyais tiré d'affaire avec mon truc qui fonctionne et juste une formalité pour faire une interface web de contrôle. Résultat : j'y ai déjà passé 2 fois plus de temps sans avoir avancé d'un poil

Voila mes états d'âmes

Merci en tout cas pour la réponse

Dernière modification par razer (31-12-2014 00:12:25)

Hors ligne

#4 31-12-2014 10:42:19

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : Template extends ne marche pas (bug ou incomprehension)

Bonjour,


razer a écrit :
urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^/ping/$', views.ping, name='ping'),
)

Le premier "/" est en trop:

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^ping/$', views.ping, name='ping'),
)

En revanche,

action="/ping/"

sinon tu risques d'avoir des surprises quand tu mettras le formulaire sur une autre url.

Hors ligne

  • Accueil
  • » Django-fr
  • » Template extends ne marche pas (bug ou incomprehension)

Pied de page des forums