Django: Reverse для 'detail' с аргументами '(' ',)' и аргументы ключевого слова '{}' not found

Я следую официальному учебнику, чтобы изучить Django и использовать 1.5.

У меня была эта ссылка как часть моего индексного шаблона, который работал нормально:

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

однако это жестко запрограммировано, и в учебнике предлагается использовать более эффективный способ:

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

так что вам будет лучше иметь дело с огромным количеством шаблонов, и вы должны внести изменения в URL.

Поскольку я сделал вышеупомянутое изменение, я получаю следующие ошибки при запуске приложения:

 Exception Type: NoReverseMatch Exception Value: Reverse for 'detail' with arguments '('',)' and keyword arguments '{}' not found. 

Мой urls.py выглядит так:

 from django.conf.urls import patterns, url from polls import views urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'), url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'), url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'), ) 

view.py выглядит так:

 from django.shortcuts import render, get_object_or_404 from django.http import Http404 from polls.models import Poll def index(request): latest_poll_list = Poll.objects.order_by('-pub_date')[:5] context = {'latest_poll_list': latest_poll_list} return render(request, 'polls/index.html', context) def detail(request, poll_id): poll = get_object_or_404(Poll, pk = poll_id) return render(request, 'polls/detail.html', {'poll': poll}) 

мой шаблон index.html выглядит так:

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

Обычно я мог легко прочитать, откуда возникает ошибка, и в этом случае я не могу определить причину ошибки, поэтому я не могу продвинуться в своем исследовании. Любая помощь будет оценена.

В вашем index.html вы дали poll_id как аргумент, но это просто имя, которое аргумент будет иметь в функции detail ; он не определен в вашем шаблоне. Фактическое значение, которое вы хотите вызвать с помощью функции, вероятно, poll.id

Моя ошибка была опечатка на detail.html :

 <form action={% url 'polls:vote' polls.id %}" method="post"> 

должно было

 <form action={% url 'polls:vote' poll.id %}" method="post"> 

Мне потребовалось некоторое время, чтобы понять, что страница трассировки django постоянно указывала мне на соответствующую строку кода. : $

Некоторое время я боролся с этим. Тогда я заметил, что у меня был опрос poll.id, а не Poll.id с (столица P)

Это случилось со мной, когда я читал учебник. Я не изменил poll_id на pk:

 url(r'^(?P<poll_id>\d+)/$', views.DetailView.as_view(), name='detail'), 

против

 url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'), 

Также в

опросы / urls.py

у меня была орфографическая ошибка

url (r '^ (? P [0-9] +) / $', views.detail, name = 'detail s '),

против правильного кода

url (r '^ (? P [0-9] +) / $', views.detail, name = 'detail'),

потратили некоторое время на поиск ошибки, поэтому ищите правильную орфографию. лол