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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

8818閲覧

Django HTMLのフォームからPOST送信されたデータを次の飛び先で使用する方法

hdahrn

総合スコア36

Django

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

Python 3.x

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

Python

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

0グッド

2クリップ

投稿2016/07/26 02:57

現在Python3.5.1 Django1.9.7を使ってWebサイトを製作しています。
そのなかで、HTMLのフォームからsubmitされたPOSTデータを次の飛び先で使用する方法がわからなくて困っています。流れとしては、フォームAで入力した文字列を、次のHTMLページにPOST送信し、そのHTMLのページでフォームAで入力してもらった文字列を解析を行い、色んなデータ(文字数など)を生成して、その複数のデータをデータベースに保存したいと考えています。

前のページのフォームデータを次のページで使用する方法について、もしご存じのお方がございましたらご教授お願いします。PythonやDjangoさらにはプログラミングについても初心者でありまして、質問内容が伝わってないかもしれませんが、どうかよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Djangoに限らずですが、サーバー側でページをまたいでデータを引き継ぐ方法にセッションというものがあります。
それを使えば、POSTを受け取ったページでデータを保存しておいて、他のページに遷移した後でも使用することができます。

※注意:セッションは使い方に気を付けないと、セキュリティー的に危険なことがあります。セッションには外部に漏れてはまずそうなものは保存しないようにしましょう。

公式リファレンス以外に分かりやすいページが見つからなかったので、キーワード"Django セッション"などででググってみて下さい。

以下、公式リファレンスのリンク ※日本語のはバージョンが古いです。

セッションの使い方 — Django 1.4 documentation
http://docs.djangoproject.jp/en/latest/topics/http/sessions.html

How to use sessions | Django documentation | Django
https://docs.djangoproject.com/ja/1.9/topics/http/sessions/

投稿2016/07/26 15:48

argius

総合スコア9388

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

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

hdahrn

2016/07/27 19:39

お忙しいなかご回答ありがとうございます。 教えていただいたリファレンスを拝見させてもらったのですが、やはりどうしてもうまくいかなかったです。せっかく教えていただいたのに申し訳ないです。 userdata.htmlから送られたPOSTデータをanalysis.htmlの中で使用したいので、以下のように書いていますが何が違うのでしょうか? ``` <!-- userdata.html --> <form action="/userdata/analysis/" method="POST"> <div class="form-group"> {{form.userdata.label}} <br> {% csrf_token %} {{form.userdata}} <br> </div> <input type="submit" value="解析"> </form> ``` ```Python #view.py def userdata(request): if request.method == 'POST': form = UserDataForm(request.POST) if form.is_valid(): # form.cleaned_data を処理 userdata = form.cleaned_data['userdata'] #セッションを利用する request.session['userdata'] = userdata return HttpResponseRedirect('/userdata/analysis/') else: form = UserDataForm() return render(request, 'app/userdata.html', {'form': form}) def analysis(request): post_userdata = request.session['userdata'] ``` このように書いてみたところ、 Exception Type: KeyError at /userdata/analysis/ Exception Value: 'userdata' というエラーが出てしまいます。 どこが原因でしょうか? もしよろしければご教授お願い致します。
argius

2016/07/28 06:38

書いていただいたuserdata.htmlを使っているなら、 userdata.htmlのPOST先がviews.analysisになっているので、 analysis()は「次の飛び先」ではなく「POSTの送信先」です。 analysis()の中で直接UserDataForm(request.POST)を使えます。 userdata()の中身を見たところでは、 何か間違いか勘違いされているようにも見えますね。
hdahrn

2016/07/28 08:06

ご回答ありがとうございます。 userdata()の中身では具体的にどういうところが勘違いしているように思われるのですか? 何かヒントとなるようなことでも教えていただくことができたら幸いです。 何度も申し訳ありません。よろしくお願いいたします。
argius

2016/07/28 08:26

userdata()はuserdata.htmlから送信されたformを受け取ろうとしているように見えますが、 userdata.htmlのactionは/userdata/analysis/になっているので、 userdata()は呼ばれず、直接analysis()に飛んでいると思ったからです。 それとも、もしかしてurls.pyには /userdata/analysis/はuserdata()にマッピングするように設定されているのですか?
hdahrn

2016/07/28 10:04

ご回答ありがとうございます。 urls.pyは以下のように設定しています。 ``` from django.conf.urls import include, url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^userdata/$', views.userdata, name='userdata'), url(r'^userdata/analysis/$', views.analysis, name='analysis'), url(r'^userdata/analysis/add/$', views.add, name='add'), ] ``` userdata.htmlの飛び先が/userdata/analysis/となっているということは,analysis()のviewに送っているということでしょうか?つまりは、userdata.htmlはaction先を/userdata/とすべきで、views.userdataの中で、userdata.htmlから送られたPOST値をセッションを用い、views.analysisの中で使用すれば良いという解釈でよろしいのでしょうか? 私としましては、userdata.htmlのフォームのactionに/userdata/analysis/とすることで、これでanalysis.htmlにデータを送っていると考えていましたので、そこが勘違いだったような気がしています。viewに処理を書いていながら、フォームからデータをviewに送っているという感覚がなかったので、根本から考えが間違っていたと気づかさせられました。 私のとんちんかんな質問に何度も付き合ってくださいありがとうございました。 argius様にご教授していただいたこと大変嬉しく思います。 もっと勉強が必要だと改めて感じさせられました。
argius

2016/07/28 10:45

> userdata.htmlの飛び先が/userdata/analysis/となっているということは,analysis()のviewに送っているということでしょうか? そうです。 > userdata.htmlから送られたPOST値をセッションを用い、views.analysisの中で使用すれば良いという解釈でよろしいのでしょうか? この場合はセッションは不要です。 セッションはページをまたいでパラメーターを引き継ぎたいときに使用するもので、直接POSTデータが取得できる場合は不要です。 セッションは、例えば、あるビューでPOSTされたデータを保存しておいて、その後で何もパラメーターが送られないページに飛んでもその値を取り出すことができる、というものです。 今回の場合は、userdata()に書いている if form.is_valid(): userdata = form.cleaned_data['userdata'] をanalysis()に持っていけば、フォームから送信された'userdata'が取り出せます。
hdahrn

2016/07/28 12:46

お世話になります。いつもご回答ありがとうございます。 教えていただいたご説明によりセッションの使い方がより理解できたと思います。 最後の > userdata()に書いている if form.is_valid(): userdata = form.cleaned_data['userdata'] をanalysis()に持っていけば、フォームから送信された'userdata'が取り出せます。 というところだけが少しよくわからずにいます。 どのように書けばanalysis()にuserdata を持って行ったことになるのでしょうか? analysis()の中でuserdataを別の変数に代入してみたところ、userdataが定義されてませんというエラーが出てしまいました。 何か特別な書き方というか、プラスして書かなければいけないものがあるのでしょうか? ご教授お願い申し上げます。どうかよろしくお願いいたします。
argius

2016/07/28 13:06

userdata()のif request.method == 'POST':以下の処理は、 userdata()ではなくanalysis()に書くべきで、userdata()には要らないので analysis()に「持っていく」と表現しました。 userdata()から切り取ってanalysis()に張り付けるくらいのニュアンスでした。 もちろんただ移動するだけではダメなのですが。 具体的には以下のようになります。 コメント欄ではインデントが消えてしまうので分かりにくかったらごめんなさい。 def userdata(request): form = UserDataForm() return render(request, 'userdata.html', {'form': form}) def analysis(request): if request.method == 'POST': form = UserDataForm(request.POST) if form.is_valid(): post_userdata = form.cleaned_data['userdata'] return render(request, 'userdata.html', {'form': form}) return HttpResponseRedirect('/userdata/')
hdahrn

2016/07/28 13:35

何度もお手数おかけし申し訳ありません。 具体的なコードを示していただきより意味がよくわかりました。 やはりまだまだ理解できていない部分がある気がしますが、理解できていないことを説明することも難しく、もう一度ドキュメントを見直し、もう少し理解が進み、わからない部分を説明できる状態になりましたら、また質問させていただこうと考えています。 この度は本当に本当にありがとうございました。 貴重なお時間を使わせてしまって申し訳ありませんでした。 こんなに親切な方がいらっしゃることを大変嬉しく思います。 ありがとうございました。
argius

2016/07/28 13:46

私もあまり上手く説明できなくてすみません。 分からないところをしっかり理解してから進めるほうが確実に上達すると私は信じています。 じっくりとがんばってください。
hdahrn

2016/07/28 14:29

応援ありがとうございます。 私の理解が低いばかりに大変ご迷惑おかけしました。 本当に本当にありがとうございました。深く深く感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問