前提・実現したいこと
Windows VS.code上でDjangoを使用しています。
検索条件を指定して検索結果一覧を表示し(get_queryset)、
さらに別の処理も実行する画面を作成しています。(post)
最初は関数だけで作成していたのですがクラスで作成し直したいと思い、ListViewを使用しています。
ListViewを使用した場合Forms.pyで表示したテンプレートの値を取り込むやり方がわかりません。
教えて頂けますでしょうか。
(色々調べて丸3日試しているのですがわかりません。。)
発生している問題
forms.pyを使用しない場合は.htmlに以下の記述で値は参照出来ました。
html
1<form action="" method="get"> 2 <input name="query" value="{{ request.GET.query }}" type="date"> 3 <button type="submit">検索する</button> 4</form>
forms.pyを使用する場合、def getをオーバーライドして以下のようにして表示は出来るようになりました。
しかし、def postでrequest.POST['***']でしか値を取得方法を知らず、他方法がわからなかったため
値を取得できません。。
viwes
1# GETオーバーライド 2 def get_context_data(self, **kwargs): 3 context = super().get_context_data(**kwargs) 4 context['search_form'] = SelectEdiForm 5 return context
html
1<form action="{% url 'index' %}" method="post"> 2 {% csrf_token %} 3 {{ search_form }} 4 <input class="btn btn-primary mt-1" type="submit" name="process" value="処 理"> 5 </form>
該当のソースコード
forms
1class SelectEdiForm(forms.Form): 2 data = [ 3 ('A', '1'), 4 ('B', '2'), 5 ('C', '3') 6 ] 7 8 choice = forms.ChoiceField(label='データ選択', \ 9 choices=data)
views
1class IndexView(LoginRequiredMixin,ListView): 2 3 template_name = 'test/index.html' 4 model = database 5 context_object_name = 'data' # templateに渡す名前 6 paginate_by = 10 7 8 9 # GETオーバーライド 10 def get_context_data(self, **kwargs): 11 context = super().get_context_data(**kwargs) 12 context['search_form'] = SelectEdiForm 13 return context 14 15 16 def get_queryset(self): # 検索機能のために追加 17 queryset = database.objects 18 query = self.request.GET.get('query') # このforms未使用のやりかたは取得できます。 19 # choiceの値を取得したいです。 20 if query: 21 data = queryset.filter(Date=query) 22 23 else: 24 data = queryset.all() 25 26 return data 27 28 29 def post(self,request): # POST処理で値は取得できます。 30 31 if 'ok' in request.POST: 32 test = request.POST['choice'] 33 print("POST_OK!!",test) 34 35 return self.get(request)
HTML
1index.html 2 3{% block content %} 4{% load crispy_forms_tags %} 5<hr> 6<div> 7 <!--検索条件--> 8 <form action="" method="get"> 9 <input name="query" value="{{ request.GET.query }}" type="date"> 10 <button type="submit">検索する</button> 11 </form> 12 13 <form action="{% url 'index' %}" method="post"> 14 {% csrf_token %} 15 {{ search_form }} 16 <input class="btn btn-primary mt-1" type="submit" name="process" value="処 理"> 17 </form> 18</div>
試したこと
def getを使用しようとしましたが、使用するとget_querysetが使用出来なくなり、ページネーションも
自分で作成しなければいけなくなるためListViewを使用する意味がなくなってしまいました。
reauest.POST[]をget_auerysetで使用したかったのでdef get_queryset(self)に引数requestを追加しようとしたのですが引数は1つとエラーメッセージが出てしまいました。
補足情報(FW/ツールのバージョンなど)
今はformsの中身はセレクト文だけですが日付検索なども追加する予定です。
Djangoを初めて数カ月で、まだまだ初心者です。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。