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

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

ただいまの
回答率

90.12%

Django2.2.4 - NoReverseMatchが解決しない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 43

Spacekoki

score 11

Django初心者です。ブログアプリのようなものを作っています。
フォームに入力した内容の詳細を表示させるページに行こうとするとこのようなエラーが出ます。フォームに入力した内容を変更するページ(http://127.0.0.1:8000/KnowHow/1/update/)などは開けるのですが,なぜか詳細を表示するリンク(http://127.0.0.1:8000/KnowHow/1/detail/)にアクセスしようとするとエラーが表示されてしまいます。

NoReverseMatch at /KnowHow/1/detail/
Reverse for 'update' with arguments '('',)' not found. 1 pattern(s) tried: ['KnowHow\\/(?P<pk>[0-9]+)\\/update\\/$']


views.py,detailページのhtml,urls.py,models.pyを置きました。推測でもいいのでコメントを頂けたら幸いです。他にも必要なコードがあればコメントください。

views.py

from django.urls import reverse, reverse_lazy
from django.http import HttpResponse
from django.views import generic
from django.shortcuts import redirect
from django.core.exceptions import PermissionDenied
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from .models import KnowHow


class IndexView(generic.list.ListView):
    model = KnowHow
    paginate_by = 5
    ordering = ['-title']
    # template_name = 'portal/KnowHow_list.html'

#該当の関数
class DetailView(generic.detail.DetailView):
    model = KnowHow
    #template_name = 'portal/KnowHow_detail.html'


class CreateView(LoginRequiredMixin, generic.edit.CreateView):  # The LoginRequired mixin
    model = KnowHow
    fields = ['title','text','basic_tag','free_tags'] 

    #template_name = 'portal/KnowHow_form.html'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(CreateView, self).form_valid(form)


class UpdateView(LoginRequiredMixin, generic.edit.UpdateView):  # The LoginRequired mixin
    model = KnowHow
    fields = ['title','text','basic_tag','free_tags']

    #template_name = 'portal/KnowHow_form.html'

    def dispatch(self, request, *args, **kwargs):
        # ownership validation
        obj = self.get_object()
        if obj.author != self.request.user:
            raise PermissionDenied('You do not have permission to edit.')

        return super(UpdateView, self).dispatch(request, *args, **kwargs)


class DeleteView(LoginRequiredMixin, generic.edit.DeleteView):  # The LoginRequired mixin
    model = KnowHow
    success_url = reverse_lazy('portal:index')

    #template_name = 'portal/KnowHow_confirm_delete.html'

    def dispatch(self, request, *args, **kwargs):
        # ownership validation
        obj = self.get_object()
        if obj.author != self.request.user:
            raise PermissionDenied('You do not have permission to delete.')

        return super(DeleteView, self).dispatch(request, *args, **kwargs)


@login_required
def help(request):
    return HttpResponse("Member Only Help Page")


portal/KnowHow_detail.html

{% extends 'base.html' %}

{% block title %}Sign up{% endblock %}

{% block content %}
<h1>{{ object.title }}</h1>
<section class="KnowHow-text">
    {{ object.text|linebreaksbr }}
    <p>Author: {{ object.author }}</p>
    <p>Free tags: {{ object.free_tags}}</p>
    <p>Basic tag: {{ object.basic_tag}}</p>
</section>


{# ownership #}
{% if request.user.id == object.author_id %}
<section class="KnowHow-edit">
    <a class="act" href="{% url 'portal:update' KnowHow.pk %}">Edit</a>
    <a class="act" href="{% url 'portal:delete' KnowHow.pk %}">Delete</a>
</section>
{% endif %}
<section>
    <p><a href="javascript:history.back()">&lt; Back</a></p>
</section>
{% endblock %}


urls.py

from django.urls import path

from . import views
# set the application namespace
# https://docs.djangoproject.com/en/2.0/intro/tutorial03/
app_name = 'portal'

urlpatterns = [
    # ex: /
    path('', views.IndexView.as_view(), name='index'),

    # ex: /KnowHow/create/
    path('KnowHow/create/', views.CreateView.as_view(), name='create'),

    # ex: /KnowHow/1/
    path('KnowHow/<int:pk>/detail/', views.DetailView.as_view(), name='detail'),

    # ex: /KnowHow/1/update/
    path('KnowHow/<int:pk>/update/', views.UpdateView.as_view(), name='update'),

    # ex: /KnowHow/1/delete
    path('KnowHow/<int:pk>/delete/', views.DeleteView.as_view(), name='delete'),

    # ex: /KnowHow/help/
    path('KnowHow/help/', views.help, name='help'),
]


models.py

from django.db import models
from django.urls import reverse
from taggit.managers import TaggableManager

class KnowHow(models.Model):

    BASIC_TAGS =(
        ('1','a'),
        ('2','b'),
        ('3','c'),
    )

    author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    basic_tag = models.CharField(max_length=1,choices=BASIC_TAGS,default='1')
    free_tags = TaggableManager(blank=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('portal:index')
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

自分もDjango始めたばかりでわからないですが
portal/KnowHow_detail.htmlの
KnowHow.pkをobject.pkにするとurlに対して正しくidが渡せて修正できるのではないでしょうか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/11 13:25

    できました!ありがとうございます!

    キャンセル

  • 2019/10/11 13:29

    :+1:

    キャンセル

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

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