質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

<int:pk>を使うとNoReverseMatchエラーが発生する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,473

mtr0326

score 11

djangoを勉強中しているものです。
現在ログイン機能(accounts)とブログ機能(my_apps)を備えたプロジェクトを試しに作っているのですが、下記のエラーに遭遇しました。
原因はおそらくpkに値がうまく渡されていないことによるURLのミスマッチだと思うのですが、書き方に誤りがありますか?
ちなみにaccountsアプリの方は、汎用ビューで普通に動いています。
1日かけても解決策がわからないので、よろしければアドバイスを頂けないでしょうか?

Reverse for 'service_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['service_detail/(?P<pk>[0-9]+)/$']
<!--accountsアプリ-->
<a href="{% url 'accounts:login'%}" class="top-bar__item top-bar__sign-in" ><i class="ui-user"></i>ログイン</a>
<a href="{% url 'accounts:signup'%}" class="top-bar__item top-bar__sign-in" ><i class="ui-user"></i>会員登録</a>
<a class="top-bar__item top-bar__sign-in" href="{% url 'accounts:user_detail' user.pk %}">ユーザー情報閲覧</a>
<a class="top-bar__item top-bar__sign-in" href="{% url 'accounts:user_update' user.pk %}">ユーザー情報更新</a>
<!--my_appsアプリ-->
<a class="top-bar__item top-bar__sign-in" href="{% url 'my_apps:service_detail' service.pk %}">サービス情報閲覧</a>
<a class="top-bar__item top-bar__sign-in" href="{% url 'my_apps:service_update' service.pk %}">サービス情報更新</a>   
#my_project/my_apps/models.py
from django.conf import settings
from django.db import models
from django.utils import timezone

class Service(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
    title = models.CharField('タイトル', max_length=200, blank=True)
    text = models.TextField('本文', blank=True)
    category = models.ForeignKey(Category, verbose_name='カテゴリ', on_delete=models.PROTECT, blank=True)
    tags = models.ManyToManyField(Tags, verbose_name="タグ", blank=True)
    date = models.DateTimeField('作成日', default=timezone.now)
#my_project/my_apps/urls.py
from django.urls import path
from . import views

app_name = 'my_apps'

urlpatterns = [
    path('', views.index, name='index'),
    path('service/', views.ServiceCreateView.as_view(), name='service'),
    path('service_detail/<int:pk>/', views.ServiceDetailView.as_view(), name='service_detail'),
    path('service_update/<int:pk>/', views.ServiceUpdateView.as_view(), name='service_update'),
]
#my_project/my_apps/view.py
from django.shortcuts import render,redirect
from .models import Service, Order
from .forms import ServiceCreateForm, ServiceUpdateForm
from django.views import generic

class ServiceCreateView(generic.CreateView):
    models = Service
    form_class = ServiceCreateForm
    template_name = 'my_apps/service-add.html'

class ServiceDetailView(generic.DetailView):
    models = Service
    template_name = 'my_apps/service-detail.html'

class ServiceUpdateView(generic.UpdateView):
    models = Service
    form_class = ServiceUpdateForm
    template_name = 'my_apps/service-update.html'


Django 2.x.x
Python 3.x

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

書き方は間違ってはいないと思います。

{% url 'my_apps:service_detail' service.pk %} の行で本来は service.pk に int の値が入っていることが期待されていると思うのですが、その service.pk が None になっている、または service そのものが空になっていることが原因ではないでしょうか。一度エラーが出るページでテンプレート変数 service の中身をチェックしてみてください。

ちなみにこれは多くの方がハマるパターンのようで、過去に同様の質問に回答した記憶があります。このあたりの質問 ↓ も本質的には同じポイントに関するものなので、よろしければ参考にしてみてください(どちらも質問者が質問しっぱなしで放置していますが、回答の方向性は間違っていないと思います・・・)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/21 21:48

    非常に参考になりました。無事に解決致しました。
    結論だけ書いておきます。

    □NoReverseMatchエラーの解消
    まずテンプレート自体がエラー表記で表示されていないので、エラー箇所(({% url 'my_apps:service_detail' service.pk %}))を一旦削除しservice変数の中身をチェック
    #templates/base.html
    <p>{{service.pk}}</p>

    何も表示されなかったのでgh640様がおっしゃるように値がうまく取得されていないことが分かった

    【結論】generic.ListViewで指定したHTMLテンプレートのfor文 {% for service in service_list %}{% endfor %}の中に{% url 'my_apps:service_detail' service.pk %}を入れると解決した。

    □ログインユーザーと各ブログ記事の紐付け
    上でエラーは解消はされたが、ログインしているユーザー以外の記事も一覧で表示されてしまったので、
    下記の記事を参考に紐付けを行った。
    参考:https://cortyuming.hateblo.jp/entry/20130824/p2

    無事ログインしている人の記事のみ表示された。

    キャンセル

  • 2019/05/25 16:35

    とても丁寧にご状況をお知らせくださりありがとうございます。そうでしたか!無事にご解決されたとのことでよかったです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る