Django学習

【Python】初めてのDjangoフォームの使い方【関数ベース】

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に定義を記載して、それを元にフォームを設定するやり方。
これは、モデルクラスを作ってからそれを利用するやり方。
フォームへの書き方はカラム名を書くだけで、シンプルだけど、データベースの設定やモデルファイルを作成する必要がある。

関数ベース シンプルに一行だけ

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(label ='お名前', max_length="40", required=False)
def contact(request):
    params = {
        'name':'お名前は?',
        'form':ContactForm(),
    }
    if (request.method =='POST'):
        params['name'] = request.POST['name'] + 'さんですね'
        
    return render(request,'contact.html',params)
{% extends 'base.html' %}
{% block body-contents %}
<h2>{{name}}</h2>
<form action="{% url 'contact' %}" method="POST">
    {% csrf_token %}
    {{form}}
    <input type="submit" value='送信'>
</form>

{% endblock %}
from django.urls import path
from . import views


urlpatterns = [
    path('contact',views.contact,name='contact'),

]


ブラウザで表示 入力前

ブラウザで表示 入力後

関数ベース 計算してみる

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 = '何年後か')
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)
{% 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 %}
from django.urls import path
from . import views


urlpatterns = [
    path('contact',views.contact,name='contact'),

]

 

ブラウザで表示 入力前

ブラウザで表示 入力後

 

総括

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