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
は主にCreateView
、UpdateView
、FormView
で使われます。
まずは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
指定します。
これでCreateView
でForm
を使えるように出来ました
Templateで使う
それでは先ほどのTodoCreateView
を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 }}
のようにすることでそれぞれを表示することが出来ます。
ボタンをクリックするとデータが保存されるはずです。
ModelForm
を簡単に使うことができました。
Just Python フリープラン
ジャスパイなら教材は全て無料!