前提・実現したいこと
Django,python3でWEBシステムを開発しています。
DetailViewのクラスの中で、sessionを取得するための関数を使用したいのですが、その関数にrequestを引数として渡す事ができず、動かす事ができません。
以下に紹介しているコードで紹介している関数を利用するためには、どのようにすれば良いでしょうか?
発生している問題・エラーメッセージ
TypeError at /detail/41/ check_session() missing 1 required positional argument: 'request'
該当のソースコード
views.py
python
1class DetailView(LoginRequiredMixin, generic.DetailView): 2 model = sampleDB 3 template_name = 'detail.html' 4 5 def check_session(self, request): 6 if not 'history' in request.session: 7 request.session['history'] = {'user': self.request.user, 'id': self.kwargs['pk']} 8 9 def get_context_data(self, **kwargs): 10 self.check_session() 11 context = super().get_context_data(**kwargs) 12 return context 13
project/urls.py
python
1from django.contrib import admin 2from django.contrib.staticfiles.urls import static 3from django.urls import path, include 4 5 6urlpatterns = [ 7 path('admin/', admin.site.urls), 8 path('', include('main.urls')), 9 path('accounts/', include('allauth.urls')), 10]
main/urls.py
python
1from django.urls import path 2from . import views 3 4app_name = 'main' 5urlpatterns = [ 6 path('', views.WelcomeView.as_view(), name='welcome'), 7 path('home/', views.HomeView.as_view(), name='home'), 8 path('detail/<int:pk>/', views.DetailView.as_view(), name='detail'), 9 path('detail_edit/<int:pk>/', views.DetailEditView.as_view(), name='detail_edit'), 10 path('resister_history/', views.ResisterHistoryView.as_view(), name='resister_history'), 11 path('resister_vegetable/', views.ResisterVegetableView.as_view(), name='resister_vegetable'), 12 path('delete/<int:pk>/', views.DeleteView.as_view(), name='delete'), 13 path('inquiry_login/', views.InquiryLoginView.as_view(), name='inquiry_login'), 14 path('inquiry/', views.InquiryView.as_view(), name='inquiry'), 15 16 path('404/', views.Error404View.as_view(), name='404'), 17 path('403/', views.Error403View.as_view(), name='403'), 18 path('500/', views.Error500View.as_view(), name='500'), 19 20]
detail.html
html
1{% extends "layout/layout_home.html" %} 2{% load custom_tags %} 3 4{% block title %} 5Detail 6{% endblock %} 7 8{% block content %} 9 10<!-- page content --> 11<div class="right_col" role="main"> 12 <div class=""> 13 <div class="page-title"> 14 <div class="title_left"> 15 <h3>登録情報 </h3> 16 </div> 17 </div> 18 <div class="clearfix"></div> 19 <div class="row"> 20 <div class="col-lg-6 offset-lg-3"> 21 22 <div class="x_panel"> 23 <div class="x_title"> 24 <h2 style="color: #2B2B2B; font-weight: bold">{{ object.name }} </h2> 25 <h2 style="color: #2B2B2B; font-weight: bold">{% none_to_blank object.type %} </h2> 26 <h2 style="color: #2B2B2B; font-weight: bold">{{ object.name }} </h2> 27 <h2 style="color: #2B2B2B; font-weight: bold">{% none_to_blank object.variety %} </h2> 28 <ul class="nav navbar-right panel_toolbox"> 29 <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a> 30 31 </li> 32 <li class="dropdown"> 33 <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" 34 aria-expanded="false"><i class="fa fa-wrench"></i></a> 35 <div class="dropdown-menu" aria-labelledby="dropdownMenuButton"> 36 <a class="dropdown-item" href="#">Settings 1</a> 37 <a class="dropdown-item" href="#">Settings 2</a> 38 </div> 39 </li> 40 <li><a class="close-link"><i class="fa fa-close"></i></a> 41 </li> 42 </ul> 43 <div class="clearfix"></div> 44 </div> 45 <div class="x_content"> 46 47 <p>登録日:{{ object.created_at }} 更新日:{{ object.updated_at }} </p> 48 <div class="x_content"> 49 <a href="{% url 'main:detail_edit' object.pk %}"> 50 <button type="button" 51 class="btn btn-success btn-m ">編集 52 </button> 53 </a> 54 <a href="{% url 'main:resister_history'%}"> 55 <button type="button" 56 class="btn btn-primary btn-m ">収穫履歴を保存 57 </button> 58 </a> 59 <a href="{% url 'main:delete' object.pk %}"> 60 <button type="button" 61 class="btn btn-danger btn-m ">削除 62 </button> 63 </a> 64 </div> 65 </div> 66 </div> 67 </div> 68 </div> 69 </div> 70</div> 71{% endblock %}
追記④
print()テスト
def get(self, request, *args, **kwargs): req = request pk = self.kwargs.get('pk') # urls.pyでpkに格納した値を取り出す。 if pk: req.session['history'] = pk # セッションに'history'という名前のキーで保存する。 print('test①') return render(req, 'detail.html') def get_context_data(self, **kwargs): print('test②') # self.get() context = super().get_context_data(**kwargs) context['pk'] = self.kwargs.get('pk') print('test③') print(context['pk']) return context
コンソール
test①
追記③
多くのご協力をいただき、解決はできていないですが、色々参考になる事がありました。
下記のコードで動かすと、最初はエラーが出ている箇所が、最初のget(self, request, *args, **kwargs):だと思っていましたが、
print()を追加して確認すると、
①
②
③
までは表示されます。
request.session['history']にPKの値が入っている事も確認できます。
ただ、return super().get(request, *args, **kwargs)のところでエラーが出てしまいます。
そこで、シンプルにreturnするものを、request.session['history']にしようと思ってもエラーが出てしまいます。
def get(self, request, *args, **kwargs): pk = self.kwargs.get('pk') # urls.pyでpkに格納した値を取り出す。 print('①') if pk: request.session['history'] = pk # セッションに'history'という名前のキーで保存する。 print('②') print('③') return super().get(request, *args, **kwargs) print('finish') def get_context_data(self, **kwargs): self.get() context = super().get_context_data(**kwargs) return context
エラーコード
TypeError at /detail/41/ get() missing 1 required positional argument: 'request'
追記②
self.check_session(self.request)
とすると、requestは引数として渡っているようですが、別のエラーが発生します。
TypeError at /detail/41/ Object of type CustomUser is not JSON serializable
追記①
以下のサイトの方法を試しましたがうまく動作しませんでした(やはりrequestを引数に渡す必要があります)
Django URLパラメータをセッションに保存してテンプレートで利用する
TypeError at /detail/41/ get() missing 1 required positional argument: 'request'
python
1class DetailView(LoginRequiredMixin, generic.DetailView): 2 model = sampleDB 3 template_name = 'detail.html' 4 5 def get(self, request, *args, **kwargs): 6 pk = self.kwargs.get('pk') # urls.pyでpkに格納した値を取り出す。 7 if pk: 8 request.session['history'] = pk # セッションに'history'という名前のキーで保存する。 9 return super().get(request, *args, **kwargs) 10 11 def get_context_data(self, **kwargs): 12 self.get() 13 context = super().get_context_data(**kwargs) 14 return context
補足情報(FW/ツールのバージョンなど)
●開発環境
- Python: 3.7.5
- Django: 2.2.2