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

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

ただいまの
回答率

90.33%

  • Python

    9269questions

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

  • Python 3.x

    7441questions

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

  • Django

    1187questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 232

tarryscoffee

score 5

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

Djangoについて質問です。

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

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

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

【環境】

macOS high sierra
python3.6
Django2.0
Pycharm
DB : sllite3

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

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

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

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

def get_form(self, form_class = None):
        if 'username' in self.request.POST:
            form_data = self.request.POST

        else:
            form_data = self.request.session.get('form_data', None)

        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】

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

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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を返すという事ではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

 不明点3

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

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

 不明点4

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

form要素
2.1 - action属性

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    9269questions

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

  • Python 3.x

    7441questions

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

  • Django

    1187questions

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