2014-08-28 2 views
1

je vérifie django pour la première fois suivant le tutoriel https://docs.djangoproject.com/en/1.6/intro/tutorial03/Django « supprimer définitivement dans urls modèles » ne fonctionne pas

Jusqu'à présent, il a été de plaine voile. J'ai rencontré un problème à la section Supprimer les URL codées en dur. J'utilise Django 1.6.6.

Quand je change l'url hardcoded de:

<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li> 

à:

<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li> 

je reçois une erreur 404 comme suit:

Page not found (404) 
Request Method:  GET 
Request URL: http://localhost:8000/polls/%7B%%20url%20'detail'%20poll.id%20%7D 

Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order: 

^polls/ ^$ [name='index'] 
^polls/ ^(?P<poll_id>\d+)/$ [name='detail'] 
^polls/ ^(?P<poll_id>\d+)/results/$ [name='results'] 
^polls/ ^(?P<poll_id>\d+)/vote/$ [name='vote'] 
^admin/ 

The current URL, polls/{% url 'detail' poll.id }, didn't match any of these. 

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page. 

L'URL qui apparaît dans la la barre d'adresse est

mylocalenv/polls/%7B%%20url%20%27detail%27%20poll.id%20%7D 

J'ai essayé de supprimer les guillemets de 'detail' mais étant donné que je suis sur django 1.6.6 je n'aurais pas besoin de le faire. Cela n'a pas fonctionné non plus. J'ai aussi essayé d'avancer un peu et d'inclure le/polls/namespace dans urls.py mais encore une fois, pas de joie.

Mon fichier urls.py ressemble à ceci:

from django.conf.urls import patterns, url 

from polls import views 

urlpatterns = patterns('', 
    # ex: /polls/ 
    url(r'^$', views.index, name='index'), 
    # ex: /polls/5/ 
    url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'), 
    # ex: /polls/5/results/ 
    url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'), 
    # ex: /polls/5/vote/ 
    url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'), 

) 

Le code exact dans mon modèle index.html est:

{% if latest_poll_list %} 
    <ul> 
    {% for poll in latest_poll_list %} 
     <li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li> 
    {% endfor %} 
    </ul> 
{% else %} 
    <p>No polls are available.</p> 
{% endif %} 

Got it

Mais je frustrante aucune idée pourquoi. En désespoir de cause dans mon index.html j'ai commencé à jouer avec le fichier index.html sur cette ligne:

<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li> 

Pour aucune raison logique que j'ai changé poll.id à poll_id. Le rechargement a cassé index.html comme je m'y attendais. Quand je l'ai changé à poll.id tout fonctionne. Cela n'a aucun sens. Je suis même revenu à l'index.html qui auparavant ne fonctionnait pas et maintenant ça marche aussi. J'ai redémarré le serveur avant chaque vérification. Je suis ennuyé. Mais au moins ça marche.

+0

On dirait que ce n'est pas le code exact dans votre modèle. Pouvez-vous copier coller le code exact? – karthikr

+0

Le reste de votre modèle fonctionne-t-il réellement? Il semble que ce n'est pas réellement analysé, donc vous obtenez la balise de modèle brut dans votre lien. –

+0

Ouais c'est ce que je pensais aussi, mais ça marche bien jusqu'à ce que je mette le lien vers la balise {% url%}. Ai-je manqué une importation ou quelque chose? –

Répondre

3

Cette ligne dans la trace arrière suggère que vous avez manqué le % avant l'accolade de fermeture.

The current URL, polls/{% url 'detail' poll.id }, didn't match any of these. 
+0

Oui c'est la suggestion. Le problème est, je n'ai pas! :) J'ai également essayé de supprimer le fichier et de le refaire juste pour voir si quelque chose de bizarre se passe. Et en le renommant et en changeant mon polls.urls d'index en index1. Toujours obtenir la même erreur et le% –

+0

manquant Je pense qu'il était plus probable que le poll.id ait été défini à '' '" {% url 'detail' poll.id} "' '' car il reconnaissait le tag de modèle d'URL comme valide. Comme c'est une chaîne et que poll_id doit être un nombre, cela a échoué. Si c'était parce que vous aviez manqué le% avant l'accolade de fermeture, cela aurait déclenché une erreur de syntaxe dans le template. – schillingt

+1

@schillingt si 'poll.id' n'était pas un nombre, alors je pense que vous obtiendriez' NoReverseMatch'. Quoi qu'il en soit, cela n'a pas vraiment d'importance, la question date d'il y a un an, donc le PO a, je l'espère, déjà résolu son problème. – Alasdair

0

Même, je faisais face à ce problème et pour moi la raison était que j'ai donné l'espace entre { % et % }, alors que la syntaxe correcte est {% et %}. Pour être complet, j'ai donné la syntaxe correcte et incorrecte ci-dessous -

syntaxe correcte - <li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>

syntaxe incorrecte - <li><a href="{ % url 'detail' poll.id % }">{{ poll.question }}</a></li>