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で使う

それでは先ほどのTodoFormViewDjangoTemplate上で使えるようにしていきます。
軽く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 フリープラン

ジャスパイなら教材は全て無料!