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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

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

Q&A

解決済

1回答

5775閲覧

Djangoにてhtmlからhtmlへ複数回renderで遷移する際、特定の値を保持し続けたいのですが

tornadon

総合スコア16

Django

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

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

0グッド

0クリップ

投稿2016/07/16 11:49

編集2016/07/16 11:50

###前提・実現したいこと
現在Django(Python3)とhtml5にてログインフォームを作成しています。
login.htmlのログインフォームからviews.pyに値を渡し、DetaBaseに値があれば
render(request,log.html,d)でlog.htmlに値を渡し、また遷移もしています。

しかし、遷移先のlog.htmlから別のhtml(result.html)に遷移する時に
さらにrender(request,result.html,d)で最初と同じように値(ユーザー名)を保持したまま遷移しようとしてもエラーが出て遷移できません。

【ファイル階層】
SVproject
|
|-SVproject
| |
| |_ sv.sqlite3
| |_ urls.py
| |_ setting.py
|
|-sv
| |
| |_ urls.py
| |_ views.py
|
|-temp
| |
| |_ index.html
| |_ login.html
| |_ log.html
| |_ result.html

###発生している問題・エラーメッセージ
【 log.htmlからformでresult.html宛にviews.pyからrenderで遷移しようとした時 】

ValueError at /sv/login/result The view sv.views.login didn't return an HttpResponse object. It returned None instead.

###該当のソースコード

【temp/login.html】 html,head等...省略 <form action="login" method="POST"> {% csrf_token %} ユーザー名: <input type="text" name="login_user" placeholder="ユーザー名を入力"> <input type="submit" value="ログイン"> {% if user %}{{ login_user }}{% endif %} {{ s_data }} </form> 【sv/views.py】 def login(request): ログインのデータベース処理...省略 if users: message = "成功" d = { 'message': message, 'user': user_name, } return render(request, 'log.html', d) 【temp/log.html】 html,head等...省略 {{ message }}<br /> {{ user }}<br /> <form action="result" method="post"> {% csrf_token %} <input type="hidden" name="users" value="{% if user %}{{ user }}{% endif %}"> <input type="submit" value="転送"> </form> <!-- ここまでは表示されて動く 転送ボタンを押すとエラー--> 【sv/views.py】 def result(request): message = "" user = "" try: user = request.POST['user'] except: message = "error" d = { 'message': message, 'user': user, } return render(request, 'result.html') 【temp/result.html】 html,head等...省略 {% if user %}{{ user }}{% endif %} {% if message %}{{ message }}{% endif %}

###試したこと
Javaで何度か利用していたのでsessionも挑戦しようと考えて下記URLを読んではみたのですが
http://docs.djangoproject.jp/en/latest/topics/http/sessions.html
少々自分には難解で具体的にどう書けばよいのかイメージが沸かず、先人のソースをそのまま貼って試してみても動かず諦めました

###補足情報(言語/FW/ツール等のバージョンなど)
OS:Windows10
Python3(Django)

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

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

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

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

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

guest

回答1

0

ベストアンサー

想像で書きますが、根本原因の方はテンプレート(log.html )の側でのformタグにしているURLが相対パスになっているからかと思います。
おそらく、URLが/loginで出力されたHTMLのactionがresultになっているため、URL解決時に/login/resultになってしまっており、result()ではなくlogin()が呼ばれています。
log.html actionに/resultを指定すれば想定通りに動くと思います。

ValueError at /sv/login/result The view sv.views.login didn't return an HttpResponse object. It returned None instead.

現時点で出力されているエラーはlogin()を呼ばれているために起きており、
login()上でusersNoneなどの理由でifブロックに入っていかず、
関数の最後に到達してNoneが暗黙で返っているのが原因です。

投稿2016/07/16 13:43

attakei

総合スコア2738

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

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

tornadon

2016/07/16 15:23

いつも解答ありがとうございます。 attakei様の仰る通りURLが本来sv/resultにならなければいけないところがsv/login/resultになっていました。 なのでlog.htmlのform action="" のurlを絶対パスにすることで解決しました。 ページ遷移中の値の保持に関しましてはJavascriptのsessionStorageを利用してみようと思います。
tornadon

2016/07/17 03:46

追記:調べていてやっと理解したのですが、POST データの処理に成功した際に HttpResponseRedirect を使うことで正しいURLになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問