DjangoBrothers BLOG ✍️

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>のように文字列型を指定した場合も同様のエラーが発生してしまいます。