Vous n'êtes pas identifié(e).
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
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
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
Bonjour,
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