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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

3695閲覧

Django ListViewクラスでforms.pyで表示した値を受け取りたい

akane_emo

総合スコア30

Django

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/09/26 00:29

前提・実現したいこと

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を初めて数カ月で、まだまだ初心者です。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

解決出来ました。

def get_context_data(self, **kwargs):でオーバーライドして、views.pyで
self.request.GET.get('設定した名前')で値を取得できるようになりました。

投稿2021/10/06 13:15

akane_emo

総合スコア30

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

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

0

ベストアンサー

IndexViewの親クラスにFormMixinを追加して、実装するのはどうでしょうか。

FormMixin

投稿2021/09/27 00:48

hasami

総合スコア1277

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

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

akane_emo

2021/09/27 13:48

hasami様 ヒントありがとうございます。 Mixinの使い方を良くわかっていなかったのですが、何とか私なりに調べて実現できました。 FormMixnを実装するとdef postではなくform_validで処理できると思ったのですが、form_validは 使えませんでした。。form_validはFormViewでしか使用できないのでしょうか? バリデーションについてあまり理解出来ていないので頑張って勉強します。 ありがとうございました。
akane_emo

2021/09/27 14:07

hasami様 申し訳ありませんが出来たと思っていたのはdef postの箇所だけで、get_querysetでformの値がまだ出来ず やり方がわかりません。templateはどのような記述にすればよいのでしょうか? 具体例を教えて頂けますでしょうか? <input name="query" value="{{ request.GET.query }}" type="date"> これでなくて{{form.as_p}}から値を取得する方法になります。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問