2020/11/02
Django デバッグReverse for with no arguments not found. 1 pattern(s) tried エラーの原因と解決方法
NoReverseMatch at / Reverse for 'XXX' with no arguments not found. 1 pattern(s) tried のエラーについて解説します。
これは、urls.pyで定義したパラメーターに正しく値が渡せていないときに発生するエラーです。
例えば、以下のようなコードがあったとします。
urls.py
from django.urls import path
from . import views
app_name = 'app'
urlpatterns = [
path('', views.index, name='index'),
path('detail/<int:blog_id>/', views.detail, name='detail'),
]
detailパスでは、<int:blog_id>
とあるのでblog_idに対応する数字を渡す必要があります。
views.pyは以下のようになっています。
views.py
from .models import Blog
def index(request):
"""トップページの表示"""
return render(request, 'index.html')
def detail(request, blog_id):
"""詳細ページの表示"""
blog = Blog.objects.get(id=blog_id)
return render(request, 'detail.html', {'blog': blog})
detail関数を実行するためには、blog_id
に対応する値が必要です。
index.html
<body>
<h1>トップページ</h1>
<!-- 詳細ページへのリンク -->
<a href="{% url 'app:detail' %}">詳細ページへ</a>
</body>
index.html(トップページ)では、detailページへのリンク(<a href="{% url 'app:detail' %}">詳細ページへ</a>
)を貼っていますが、これだけだとパラメーターblog_id
に渡す値が指定されていないのでエラーとなってしまいます。
<a href="{% url 'app:detail' blog_id=7 %}">詳細ページへ</a>
のようにして、URLのblog_idに対応する値を指定することでエラーは解消されます。
なお、blog_id=
は省略可能で`<a href="{% url 'app:detail' 7 %}">詳細ページへ</a>
でも正常に動作します。
型の違いによるエラー
blog_id
に対応する値を指定していたとしても、想定通りの型を指定していなければエラーになります。
今回の場合、urls.pyでは'detail/<int:blog_id>/'
のように定義していて、blog_id
にはint型つまり数字が渡されることを想定しています。
そのため、<a href="{% url 'app:detail' AAA %}">詳細ページへ</a>
のように文字列型を指定した場合も同様のエラーが発生してしまいます。