概要
djangoを使ったブログ投稿アプリ制作で躓いたため記事を作りました。
解決したかったこと
任意の詳細ページから更新ページへ飛んで、更新ボタンを押したらまた詳細ページへ飛ぶ仕様を実現したかった
よくある記事
任意の詳細ページから更新ページへ飛んで、更新ボタンを押したら一覧ページに飛ぶ仕様。この問題を解決するためのサイトはたくさんあるが、中々上記の解決方法が乗っているサイトがなかったため記載します。
前提情報
- 任意の詳細ページはdetail.html
- それに紐づく更新ページはupdate.htmlと仮定
- detail.html内にある「更新」ボタンを押すと、update.htmlを表示
- update.html内にある「更新」ボタンを押すと情報が更新されたdetail.htmlが表示されるようにする
- アプリの階層は
├── aaaフォルダ
├──blogフォルダ(今回のアプリケーション名)
├──urls.py ※今回記述箇所
├──views.py ※今回記述箇所
├──models.py
├── confフォルダ
└── templatesフォルダ
実装方法
name='blog_detail'
と記述しています
urlpatterns = [
````
path('detail/<int:pk>', views.BlogDetail.as_view(), name='blog_detail'),
path('update/<int:pk>', views.BlogUpdate.as_view(), name='blog_update'),
````
]
def get_success_url(self):~~
を追加します。
print文はpkの値をコンソールにて確認したいため記述しています。
print文はなくてもOK
reverse_lazyを利用して処理を完了した後に詳細ページに飛ばします。
('blog:blog_detail', kwargs={'pk': self.object.pk})の部分が重要で
('アプリケーション名:urls.pyで設定したname',id)となります。
これが
~blog/blog_detail/1 のURLなります。
~
~
~
from django.urls import reverse_lazy ※この行を追加
urlpatterns = [
````
class BlogUpdate(generic.UpdateView):
model = Post
form_class = BlogUpdateForm
template_name = 'blog/blog_update.html'
※↓ここ重要!!!!!!!
def get_success_url(self):
print(self.object.pk)
print('こんにちは')
return reverse_lazy('blog:blog_detail', kwargs={'pk': self.object.pk})
````
]
※参考
update.htmlではinputタグを用いてデータを送信しています。
そのためViews.pyのUpdateViewにて処理が終わったらページに遷移するコードを書かなければならないのです。
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" id="save" value="更新">
</form>