py-py’s blog

何か書くよ

DjangoのFormについて

applicationフォルダ配下にforms.pyを作る。

フォームを定義するには

のどちらかを使う。

django.forms.ModelFormの方が、既存Modelを流用できるため楽に書ける。

django.forms.Formを使った場合。
forms.py

from django import forms

class TestForm(forms.Form):
  name = forms.CharField(label="name", max_length=20)
  age = forms.IntegerField()
  message = forms.CharField(label="message", max_length=50)

django.forms.ModelFormを使った場合。

forms.py

from django import forms
from .models import ModelName

class TestForm(forms.ModelForm):
  class Meta:
    model = ModelName
    fields = ("name", "age", "message")

ModelFormの方が書きやすいが、バリデーションを考えるとFormも書きやすい?

applicationフォルダ配下にvalidate.pyを作成

validate.py

from django.core.exceptions import ValidationError

# ここでは引数の文字列に指定するものがあればバリデーションエラーを発生させる
def test_validation(msg):
  if "##" in msg:
    raise ValidationError(f"{##}が入っているため使えません")

forms.py

from django import forms
from .validate import test_validation

class SomeForm(forms.Form):
  item = forms.CharField(label="item_name", validators=[test_validation], max_length=10)

ModelFormの方は、既存Modelにオプションとして付与する。

models.py

from django.db import models
from .validate import test_validation

class Some(models.Model):
  item = models.CharField(max_length=10, validators=[test_validation])