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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1142閲覧

Django の post.pk がちゃんと参照されない。

ryujno

総合スコア19

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/17 00:31

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
DJANGO for BEGINNERSの6章を参考に、blogづくりに取り組んでいます。
その内、ブログ投稿記事の編集/削除機能を実装中に、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

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

以下、全文。

Environment: Request Method: GET Request URL: http://127.0.0.1:8000/post/1/ Django Version: 2.0.6 Python Version: 3.7.1 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog'] Installed Middleware: ['django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware'] Template error: In template C:\Users\ryuno\OneDrive\venv\blog\templates\base.html, error at line 7 Reverse for 'post_edit' with arguments '('',)' not found. 1 pattern(s) tried: ['post/(?P<pk>[0-9]+)/edit/$'] 1 : <!DOCTYPE html> 2 : {% load staticfiles %} 3 : <html> 4 : <head> 5 : <title>blog</title> 6 : <link href="https://fonts.googleapis.com/css?family=Sedgwick+Ave" rel="stylesheet"> 7 : <link rel="stylesheet" href="{% static 'css/base.css' %}"> 8 : </head> 9 : 10 : <body> 11 : <div class ="container"> 12 : <header> 13 : <div class=""nav-left> 14 : <h1><a href="/">blog</a></h1> 15 : </div> 16 : <div class="nav-right"> 17 : <a href="{% url 'post_new' %}">+ New Blog Post</a> Traceback: File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\core\handlers\exception.py" in inner 35. response = get_response(request) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\core\handlers\base.py" in _get_response 158. response = self.process_exception_by_middleware(e, request) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\core\handlers\base.py" in _get_response 156. response = response.render() File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\response.py" in render 106. self.content = self.rendered_content File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\response.py" in rendered_content 83. content = template.render(context, self._request) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\backends\django.py" in render 61. return self.template.render(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\base.py" in render 175. return self._render(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\base.py" in _render 167. return self.nodelist.render(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\base.py" in render 943. bit = node.render_annotated(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\base.py" in render_annotated 910. return self.render(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\loader_tags.py" in render 155. return compiled_parent._render(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\base.py" in _render 167. return self.nodelist.render(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\base.py" in render 943. bit = node.render_annotated(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\base.py" in render_annotated 910. return self.render(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\loader_tags.py" in render 67. result = block.nodelist.render(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\base.py" in render 943. bit = node.render_annotated(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\base.py" in render_annotated 910. return self.render(context) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\template\defaulttags.py" in render 447. url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\urls\base.py" in reverse 90. return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)) File "C:\Users\ryuno.virtualenvs\blog-ksWCC2Zg\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix 636. raise NoReverseMatch(msg) Exception Type: NoReverseMatch at /post/1/ Exception Value: Reverse for 'post_edit' with arguments '('',)' not found. 1 pattern(s) tried: ['post/(?P<pk>[0-9]+)/edit/$']

該当のソースコード

HTML

1<!-- post_detail.html --> 2{% extends 'base.html' %} 3 4{% block content %} 5 6 <div class="post-entry"> 7 <h2>{{ detail_page.title }}</h2> 8 <p>{{ detail_page.body }}</p> 9 </div> 10 11 <a href="{% url 'post_edit' post.pk %}">Edit</a> 12 <a href="{% url 'post_delete' post.pk %}">Delete this</a> 13{% endblock content %}

NoReverseMatchは、urls.pyのエラーが大半というので、以下に写します。
しかし、ここを変えることに意味はなかったです。

python

1from django.urls import path 2from . import views 3 4urlpatterns = [ 5 path('', views.BlogListView.as_view(), name = 'home'), 6 path('post/<int:pk>/', views.BlogDetailView.as_view(), name='post_detail'), 7 path('post/new/', views.BlogCreateView.as_view(), name='post_new'), 8 path('post/<int:pk>/edit/', views.BlogUpdateView.as_view(), name='post_edit'), 9 path('post/<int:pk>/delete/', views.BlogDeleteView.as_view(), name='post_delete'), 10]

またedit画面と、delete画面のHTMLは、それぞれ以下の通りです。

HTML

1<!-- post_edit.html --> 2{% extends 'base.html' %} 3 4{% block content %} 5 <h1>Edit Post</h1> 6 <form action="" method="post">{% csrf_token %} 7 {{ form.as_p }} 8 <input type="submit" value="Update" /> 9 </form> 10{% endblock content %}

HTML

1<!-- post_delete.html --> 2{% extends 'base.html' %} 3 4{% block content %} 5 <h1>Delete Post</h1> 6 <form action="" method="post">{% csrf_token %} 7 <p>Are You sure to delete this post "{{ post.title }}"</p> 8 <input type="submit" value="Confirm" /> 9 </form> 10{% endblock content %}

試したこと

post.pk を、1 とか 2 といった数字に書き換えた場合は成功しました。

HTML

1<!-- post_detail.html --> 2<!-- post.pk -> 1 に変更 --> 3 4 <a href="{% url 'post_edit' 1 %}">Edit</a> 5 <a href="{% url 'post_delete' 1 %}">Delete this</a> 6

その他、タイポチェックもしましたが、特に見当たらなかったです。

補足情報(FW/ツールのバージョンなど)

text

1<!-- requirments.txt --> 2Django==2.0.6 3gunicorn==19.9.0 4pytz==2018.7 5whitenoise==4.1.2

初質問で聞き方もよくわかっていないですが、どうぞよろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

<!-- post_detail.html --> <!-- post.pk -> detail_page.pk に変更 -->
<a href="{% url 'post_edit' detail_page.pk %}">Edit</a> <a href="{% url 'post_delete' detail_page.pk %}">Delete this</a>

投稿2018/12/17 23:13

ryujno

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーメッセージと

post.pk を、1 とか 2 といった数字に書き換えた場合は成功しました。

という事実から

html

1 <a href="{% url 'post_edit' post.pk %}">Edit</a>

のところでエラーが出ていて、 post.pk または post 変数そのものが存在しないことが原因ではないかと思います。

BlogDetailView から post_detail.html にテンプレート変数が渡せていないのではないかと思うのですがいかがでしょうか。かんたんにチェックする方法のひとつはテンプレート内に post.pk: {{ post.pk }} post: {{ post }} 等と書いてチェックすることです。

お望みであれば BlogDetailView のコードをご提示になるとより具体的に議論ができるものと思います。

投稿2018/12/17 06:26

gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryujno

2018/12/17 23:13

ありがとうございます! 頂いた内容ヒントに解決しました! BlogDetailViewで、 ”context_object_name = 'detail_page'”と名称指定していたのが、 原因だったようです。 class BlogDetailView(DetailView): model = Post template_name = 'post_detail.html' context_object_name = 'detail_page' 該当箇所を、"post.pk" -> "detail_page.pk"へと変更したら直りました! ありがとうございました!
gh640

2018/12/18 05:07

そうでしたか。 `post` という名前でテンプレート変数が渡されていなかったのが原因ということですね。 ご丁寧に結果をご共有くださりありがとうございます。よかったです :)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問