[Django]フォーム機能

### フォームクラス
Djangoに予め用意されているフォームクラスを使う
– アプリケーションフォルダ内にforms.pyを作成する

/hello/forms.py

1
2
3
4
5
6
from django import forms
 
class HelloForm(forms.Form):
    name = forms.CharField(label='name')
    mail = forms.CharField(label='mail')
    age = forms.IntegerField(label='age')

– Formクラスはform.Formというクラスを継承している
– クラス内には用意するフィールドを変数として用意する
– forms.CharFieldはテキスト、forms.IntegerFieldは整数値

### views.py
/hello/views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.shortcuts import render
from django.http import HttpResponse
from .forms import HelloForm
 
def index(request):
    params = {
        'title':'Hello',
        'message':'your data',
        'form': HelloForm(),
    }
    if (request.method == 'POST'):
        params['message'] = 'name: ' + request.POST['name'] + \
            "<br>mail: " + request.POST['mail'] + \
            "<br>age: " + request.POST['age']
        params['form'] = HelloForm(request.POST)
    return render(request, 'hello/index.html', params)

– 初期値は’form’: HelloForm()とし、送信後はparams[‘form’] = HelloForm(request.POST)として上書きしている

### index.html
/hello/templates/hello/index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{title}}</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossoorigin="anonymous">
</head>
<body class="container">
    <h1 class="display-4 text-primary">{{title}}</h1>
    <p class="h5 mt-4">{{message|safe}}</p>
    <form action="{% url 'index' %}" method="post">
        {% csrf_token %}
        {{ form }}
        <input class="btn btn-primary" type="submit" value="click">
    </form>
</body>
</html>

– formの具体的内容は既に作成済の為、{{ form }}のみ記載
– {{messsage|safe}}はエスケープ処理なし

### urls.py
/hello/urls.py

1
2
3
urlpatterns = [
    path('', views.index, name='index'),
]