Djangoの学習 フォームの使い方

【Python】クラスベースと関数ベースの書き方views.py・forms.py【Django】Djangoの学習 機能ごとの書き方の例
https://prcmyself.com/first-django-step-2
1.ビ...
フォームについて
フォームには2つタイプがある。
一つは、django.forms.Formクラスを継承したやり方。
これは、forms.pyに直接フォームの定義を記載する。
直接記載するので、forms.pyに定義づけは必要だけど、データベースとは関係なので、モデルファイルは作らなくてもOKなやり方。
もう一つは、django.forms.ModelFormクラスを継承したやり方。
これば、models.pyに定義を記載して、それを元にフォームを設定するやり方。
これは、モデルクラスを作ってからそれを利用するやり方。
フォームへの書き方はカラム名を書くだけで、シンプルだけど、データベースの設定やモデルファイルを作成する必要がある。
関数ベース シンプルに一行だけ
1 2 3 4 |
from django import forms class ContactForm(forms.Form): name = forms.CharField(label ='お名前', max_length="40", required=False) |
1 2 3 4 5 6 7 8 9 |
def contact(request): params = { 'name':'お名前は?', 'form':ContactForm(), } if (request.method =='POST'): params['name'] = request.POST['name'] + 'さんですね' return render(request,'contact.html',params) |
1 2 3 4 5 6 7 8 9 10 |
{% extends 'base.html' %} {% block body-contents %} <h2>{{name}}</h2> <form action="{% url 'contact' %}" method="POST"> {% csrf_token %} {{form}} <input type="submit" value='送信'> </form> {% endblock %} |
1 2 3 4 5 6 7 8 |
from django.urls import path from . import views urlpatterns = [ path('contact',views.contact,name='contact'), ] |
ブラウザで表示 入力前
ブラウザで表示 入力後
関数ベース 計算してみる
1 2 3 4 5 6 |
from django import forms class ContactForm(forms.Form): name = forms.CharField(label ='お名前', max_length="40", required=False) age = forms.IntegerField(label = '年齢') years = forms.IntegerField(label = '何年後か') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from django.shortcuts import render from django.http import HttpResponse from django.shortcuts import redirect from django.views import generic from .forms import ContactForm def contact(request): params = { 'name':'お名前は?', 'age':'年齢は?', 'years':'〇年後何歳か計算します', 'ans':'', 'form':ContactForm(), } if (request.method =='POST'): params['name'] = request.POST['name'] + 'さん' params['age'] = request.POST['age'] + '歳ですね' params['years'] = request.POST['years'] + '年後は' ans = int(request.POST['age']) + int(request.POST['years']) params['ans'] = str(ans)+'歳ですね' return render(request,'contact.html',params) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{% extends 'base.html' %} {% block body-contents %} <h2>{{name}}</h2> <h2>{{age}}</h2> <h2>{{years}}</h2> <h2>{{ans}}</h2> <form action="{% url 'contact' %}" method="POST"> {% csrf_token %} {{form}} <input type="submit" value='送信'> </form> {% endblock %} |
1 2 3 4 5 6 7 8 |
from django.urls import path from . import views urlpatterns = [ path('contact',views.contact,name='contact'), ] |
ブラウザで表示 入力前

ブラウザで表示 入力後

総括
もう一つのクラスベースは、モデルファイルを作ってマイグレーションとかしないといけないので、長くなるから別の記事でやる。
関数ベースの方は、設定したらそのまま使えるので、気軽に使えるイメージだった。
あまりまだ理解は深まっていないけど、とりあえずそんな感じ。