私は公式チュートリアルに従って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'),
)
views.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 traceback pageが常に関連するコード行を指し示していることに気付くまでに時間がかかりました。 :$
これは、チュートリアルを読んでいたときに起こりました。 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'),
私はこれにしばらく苦労しました。次に、Poll.idではなくpoll.idを(大文字のP)
Views.pyのフィルター条件を修正した後、エラーが解決されました。
views.pyのスニペット
def post_share(request, post_id):
post = get_object_or_404(Post, id=post_id, status='Published')
models.pyのスニペット
class Post(models.Model):
STATUS_CHOICES=(
('draft','Draft'),
('published','Published'),
)
最初の値はデータベースに保存され、2番目の値はユーザーへの表示用です。
mysql DBからの生データ
+---------------------------------------+-----------+
| title | status |
+---------------------------------------+-----------+
| Revolution 2020 | published |
| harry potter and the sorcerer's stone | published |
| harry potter and the cursed child | draft |
| five point someone | published |
| half girlfriend | draft |
| one night at the call center | published |
| Django by example | published |
+---------------------------------------+-----------+
「published」を使用していたときに、前述のエラーが発生していました。フィルターを「Published」に変更すると、すべてが整理されました。
また、
polls/urls.py
スペルミスがありました
url(r '^(?P [0-9] +)/ $'、views.detail、name = 'detail s')、
vs正しいコード
url(r '^(?P [0-9] +)/ $'、views.detail、name = 'detail')、
エラーを探すのにしばらく時間を費やしたので、適切なスペルを探してください。笑