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

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

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

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

Python 3.x

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

Python

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

Q&A

2回答

8121閲覧

Djangoに実装されている関数(get_form、form_valid)について

tarryscoffee

総合スコア13

Django

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

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2018/07/18 06:53

閲覧いただきありがとうございます。

Djangoについて質問です。

現在下記URLを参考にDjangoを利用したセッションの活用方法を勉強しています。
Djangoで、フォームの内容を保持する(セッション編)

学習を進めていくにつれて、上記チュートリアルにおいて4点ほど調べてみても分からない点が出て来たので、わかる部分だけでもご教授いただければと思います。

質問内容の内容としては、エラーでハマっているわけでは無く、
チュートリアルに記載されているソースコードに使われているメソッドなどがどういう意図で実装され、また、使用されるのかと言ったものになります。

###【環境】
macOS high sierra
python3.6
Django2.0
Pycharm
DB : sllite3

###【不明な点1 ファイル名 : views.py】

python

1self.request.session.get('form_data', None) 2self.request.session.pop('form_data', None)

この第2引数のNoneというのは何をしていしているのでしょうか。
探し方が甘かったのかもしれませんが、ググって見ても解説している箇所が見つけることができませんでした。

###【不明な点2 ファイル名 : views.py】

python

1def get_form(self, form_class = None): 2 if 'username' in self.request.POST: 3 form_data = self.request.POST 4 5 else: 6 form_data = self.request.session.get('form_data', None) 7 8 return self.form_class(form_data)

上記コードのget_form()は何を処理するメソッドなのでしょうか。
edit.pyでの定義元を見てみると「Return an instance of the form to be used in this view.」と説明されており、ざっくり意訳すると「このビューで使われているフォームインスタンスを返す」ですが、いまいち理解ができません。
views.pyの処理自体は、usernameがあるかないかで条件分岐をしていますが、そもそもそれだけであればこの関数をオーバーライドして処理をする必要があるのかも分かりません。。

###【不明な点3 ファイル名 : views.py】

python

1def form_valid(self, form): 2 self.request.session['form_data'] = self.request.POST 3 return super().form_valid(form)

こちらも【不明な点2】と同じ理由で、form_valid()が何をしている関数なのかがわかりません。views.pyの内容的にはセッション変数に値を格納して、親のform_valid(form)を返しているだけになりますが、なぜform_valid()をオーバライドし、親のform_valid()を返す必要があるのかがわかりません。

###【不明な点4 ファイル名 : user_data_input.html】

html

1<form action="" method="POST">

上記<form>タグについてですが、値の送り先のaction=“”が空白になっています。
これはDjangoにはあらかじめ「空白であった場合〇〇に飛ばす」という仕様があるという理解でよろしいでしょうか。

以上、大変長くなりましたが、わかる範囲で構いませんので、
ご教授いただければと思います。

それでは宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

不明点3

form_valid()は、postされた際、validationがOKだった場合に、システムからコールされる関数です。
保存処理や、後処理、リダイレクト先を設定するために利用します。

親のform_valid()の実行結果を戻すと、デフォルトのリダイレクト先(success_url)が設定されます。
クラスベースのビューでフォームを扱う
基本的なフォーム - メモ

不明点4

djangoの仕様とは関係ないですね。
actionが空白の場合は、フォーム自身のURLにPostされるようです。

form要素
2.1 - action属性

投稿2018/07/19 00:27

編集2018/07/19 00:38
Meganezaru

総合スコア715

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

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

0

get()にはデフォルト値が指定できるようです。
self.request.session.get('form_data', None)
第一引数が指定されなかった場合、第二引数で定めた値を返すようです
Python Django Get Post

def get_form(self, form_class=None): # user_data_input.hmltで、データを送信した場合はここ if 'username' in self.request.POST: form_data = self.request.POST # 確認画面(user_data_confirm.html)から戻るリンクを押した場合や # 初回の入力欄表示はここ。セッションにユーザーデータがあれば、それをフォームに束縛させる else: form_data = self.request.session.get('form_data', None) return self.form_class(form_data)

リクエストに'username'が含まれていない場合sessionから'form_data'を取得してきて、無い場合はNoneを返すという事ではないでしょうか。

投稿2018/07/18 11:58

grilled_python

総合スコア237

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問