ModelForm

ModelForm

Djangoではフォームを簡単に作成するためにFormが用意されています。
主に2種類あります。

forms
- forms.Form
- forms.ModelForm

ModelFormは1つのModelを作成するときに使われます。
複数のModelを扱いたい場合は柔軟に処理を書きたい場合はForm`を使うのが良いでしょう。

場合によりますが、ModelFormを使える場合はModelFormを使うといいでしょう。
コード量が少なく比較的簡単に書けるからです。

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

上記のModelに紐づいたModelFormを書いていきます。

forms.py


from django import forms

from .models import Todo


class TodoForm(forms.ModelForm):

    class Meta:
        model = Todo
        fields = ('title', 'detail', )

Viewで使う

ModelFormは主にCreateViewUpdateViewFormViewで使われます。
まずはCreateViewを作って見ていきましょう。

views.py

from django.views.generic import (
    ListView, DetailView, CreateView, UpdateView, DeleteView
)
from django.urls import reverse_lazy

from .models import Todo
from .forms import TodoForm


class TodoCreateView(CreateView):

    template_name = 'todo/create.html'
    model = Todo
    form_class = TodoForm
    success_url = reverse_lazy('todo:index')

todo_create = TodoCreateView.as_view()

from .forms import TodoForm

まずここでimportします。

form_class = TodoForm

form_classに先ほど作成したTodoForm指定します。

これでCreateViewFormを使えるように出来ました

Templateで使う

それでは先ほどのTodoCreateViewDjangoTemplate上で使えるようにしていきます。
軽く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 }}のようにすることでそれぞれを表示することが出来ます。
ボタンをクリックするとデータが保存されるはずです。

ModelFormを簡単に使うことができました。

Just Python フリープラン

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