Formでデータを保存するまでの流れ
Form
ここではforms.Formの基本的な使いかたを学習します。
実際は主に1つのモデルに依存したくないときに使ったりするのですが
ここでは学習のために1つのモデルに対して取り組みます。
フォームに入力し保存するところまでやります。
forms.pyの作成
まずはforms.py
のファイルを作成しましょう。
your_app
├── __init__.py
├── admin.py
├── apps.py
├── forms.py
├── models.py
├── tests.py
├── urls.py
└── views.py
このような位置にforms.py
を作成してください。
例えばこのようなModel
あるものとして進めていきます。
models.py
from django.db import models
class Todo(models.Model):
title = models.CharField(max_length=100, verbose_name="タイトル")
detail = models.TextField(verbose_name="詳細")
created = models.DateTimeField(auto_now_add=True, verbose_name='作成日時')
updated = models.DateTimeField(auto_now=True, verbose_name="更新日時")
def __str__(self):
return self.title
それではForm
を書いていきましょう。
forms.py
from django import forms
class TodoForm(forms.Form):
title = forms.CharField(label="タイトル")
detail = forms.CharField(label="詳細", widget=forms.Textarea)
models.py
みたいな感じなので理解しやすいと思います。
Viewで使う
それではFormView
を作って見ていきましょう。
views.py
class TodoFormView(FormView):
template_name = 'todo/form.html'
form_class = TodoForm
success_url = reverse_lazy('todo:index')
def form_valid(self, form):
title = form.cleaned_data['title']
detail = form.cleaned_data['detail']
Todo.objects.create(
title=title,
detail=detail,
)
return super().form_valid(form)
title = form.cleaned_data['title']
detail = form.cleaned_data['detail']
form.cleaned_data['key']
これで入力されたデータを取得することが出来ます。
これはバリデーションが通ったデータです。
Templateで使う
それでは先ほどのTodoFormView
をDjango
のTemplate
上で使えるようにしていきます。
軽くBootstrap
でスタイルを当てています。
{% extends 'base.html' %}
{% load static %}
{% block main %}
<div class="container">
<form action="" method="POST">
{% csrf_token %}
<div class="row">
<div class="col-sm-7 col-md-6 mx-auto">
<label for="{{ form.title.id_for_label }}">Title:</label>
{{ form.title }}
</div>
</div>
<div class="row">
<div class="col-sm-7 col-md-6 mx-auto">
<label for="{{ form.detail.id_for_label }}">Detail:</label>
{{ form.detail }}
</div>
</div>
<div class="row">
<div class="col-sm-7 col-md-6 mx-auto text-center">
<button type="submit" class="btn bg-white shadow">作成する</button>
</div>
</div>
</form>
</div>
{% endblock %}
{{ form.title }}
や{{ form.detail }}
のようにすることでそれぞれを表示することが出来ます。
ボタンをクリックするとデータが保存されるはずです。
これでforms.Form
データを保存することが出来ました。
Just Python フリープラン
ジャスパイなら教材は全て無料!