Django FormViewの作成の基本メモ

昨日はCreateViewだったので今回はFormViewについて

最低限必要なもの

---物理---
・Djangoインスト+環境構築済み
・Djangoでプロジェクトでプロジェクト(空でもOK)作成済み

---知識---
・新しいファイルを作る(forms.py)
・別のファイルから(上記のforms.pyを)インポートできる
・urls.pyから今回作成するviewを紐づけ(ルーティング)できる
・使用したいHTMLの場所をviewから指定できる


上記は完了もしくはできる前提

今回の例の環境

***最低限に加えて***
・アプリケーションフォルダ作成済み
・プロジェクトのurls.pyからアプリのurlsにルーティング済み
・settings.pyのINSTALLED_APPSにアプリ登録済み
・forms.py作成済み
・forms.pyのカラム項目のみ作成済み
class TestForm(forms.Form):
name=forms.CharField(label ="名前");
age=forms.IntegerField(label ="年齢");

フォルダ構造

画像1

 #forms .py

from django import forms

class TestForm(forms.Form):
   name=forms.CharField(label ="名前");
   age=forms.IntegerField(label ="年齢");

Viewを作成

from django.views.generic import FormView
from pulls import  forms

class FormViewTest(FormView):
   template_name ="test/formview.html"
   form_class=forms.TestForm
   success_url="test/formview.html"

これで最低限の作成

template_name 使用するテンプレート(HTML)の場所
form_class 自分が使うフォームクラス
success_url 問題がなかった時に遷移するテンプレートのパス

これだけだとcreateViewと変わらない。
違うのは送信されてもDBへ登録がされないこと


フォームの形式にあって送られた(バリテート成功)時の処理を追加

class FormViewTest(FormView):
   template_name ="test/formview.html"
   form_class=forms.TestForm
   success_url="test/formview.html"

   def form_valid(self,form):
       print("成功")
       return super().form_valid(form);

これで成功時にコンソールに成功と出るようになる
form_validはもともとフォーム(バリテート成功)時の処理をやっていたメゾットなので同名のメゾットとつくつことで処理を上書き(ovreride)する

今回はコンソールに成功と表示させた後

super().form_valid(form) 
superは継承元(FormView)の処理を行うことを示す
これにより上書きしないときでもやっていたことをやらせることができる


Formクラスのメゾットの実行

読み込んでいるFormを編集してメゾットを追加

class TestForm(forms.Form):
   name=forms.CharField(label ="名前");
   age=forms.IntegerField(label ="年齢");

   def test(self):
       print("test_ok")

これをViewで使用する

class FormViewTest(FormView):
   template_name ="test/formview.html"
   form_class=forms.TestForm
   success_url="test/formview.html"

   def form_valid(self,form):
       print("成功")
       form.test();
       return super().form_valid(form);

form.メゾット名で
formでないのメゾットを実行可能
もしformがModelFormを継承していた時
form.save()でDBに保存させる処理も可能












今回利用する例


この記事が気に入ったらサポートをしてみませんか?