[Django]ビュー関数をクラス化

– TemplateViewクラスを継承して定義する
– TemplateViewクラスはViewクラスの派生クラス

class クラス名 (TemplateView)
	
	def get(self, request):
		...GET時の処理...

	def post(self, request):
		...GET時の処理...

### HelloViewクラス
/hello/views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import TemplateView
from .forms import HelloForm

class HelloView(TemplateView):

	def __init__(self):
		self.params = {
			'title': 'Hello',
			'message': 'your data:',
			'form': HelloForm()
		}

	def get(self, request):
		return render(request, 'hello/index.html', self.params)

	def post(self, request):
		msg = 'あなたは、<b>' + request.POST['name'] + \
			'(' + request.POST['age'] + \
			')</b>さんです。<br>メールアドレスは<b>' + request.POST['mail'] + \
			'</b>ですね。'
		self.params['message'] = msg
		self.params['form'] = HelloForm(request.POST)
		return render(request, 'hello/index.html', self.params)

– __init__は初期化メソッド

/hello/urls.py

from django.conf.urls import url
from .views import HelloView

urlpatterns = [ 
	url(r'', HelloView.as_view(), name='index'),
]

フォームは関数で書くよりもクラス推奨のようです。

[Django]フィールドをタグで整形

Djangoのフォームクラスには出力機能が備えられている
– form.as_table
– form.as_p
– form.as_ul

<form action="{% url 'index' %}" method="post">
		{% csrf_token %}
		<table>
		{{ form.as_table }}
			<tr>
				<td></td>
				<td><input class="btn btn-primary" type="submit" value="click"></td>
			</tr>
		</table>
	</form>

– form.as_tableだけだとtr, tdタグしか出力されない為、tableタグを用意する必要がある

## Bootstrapクラス
### forms.py
/hello/forms.py

class HelloForm(forms.Form):
	name = forms.CharField(label='name', widget=forms.TextInput(attrs={'class':'form-control'}))
	mail = forms.CharField(label='mail', widget=forms.TextInput(attrs={'class':'form-control'}))
	age = forms.IntegerField(label='age', widget=forms.NumberInput(attrs={'class':'form-control'}))

– TextInputはformsはinput type=”text”
– NumberInputはformsはinput type=”number”

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

<form action="{% url 'index' %}" method="post">
		{% csrf_token %}
		{{ form.as_table }}
		<input class="btn btn-primary my-2" type="submit" value="click">
	</form>

attributeは絶対に実装するので、このwidgetの書き方は必須です。

[Django]フォーム機能

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

/hello/forms.py

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

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

{% 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

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