ぷろぐら×でざいん

Django ModelFormをカスタマイズする

Django ModelFormをカスタマイズする

Django ModelFormをカスタマイズする

Django ModelForm

便利ですよね。日常的に使ってますが、カスタマイズの方法がわからず最初は苦労しました。
ModelFormを利用することで、Modelの情報を元にすぐにフォームを作成できます。

from django import forms
from django.db import models


class Item(models.Model):
    name = models.CharField(max_length=255)
    note = models.TextField(default='', blank=True)
    price = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True, )
    updated_at = models.DateTimeField(auto_now=True, )


class ItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ('id', 'note', 'price',)

これだけの記述だけHTMLを出力し、入力チェックを行うフォームを生成してくれるのですから開発工数は激減しますね。またラベルやテキストボックスもしっかりと出力されます。


カスタマイズ

min_valueを指定する

現状のModelだと priceが 0を許容しているため、ユーザーは0をそのまま入力しても入力チェックを通ってしますね。
ですので….

class ItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ('id', 'note', 'price',)

    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        self.fields['price']= forms.IntegerField(min_value=1)

イニシャライズする時に、最低1以上じゃないとダメだよと記述を追加します。


ラベル名を変更する

labelsの変数を作ればラベル名を下記のように変更できます。

class ItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ('id', 'note', 'price',)
        labels = {
        	'price': '価格',
        	'note': 'メモ',
        }

    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        self.fields['price'].required = forms.IntegerField(min_value=1)

フィールド必須項目に変更する

今のModelだとnoteblank=Trueとなっているので、空白の状態でも保存処理を行うことができます。
ですので、またイニシャライズで必須項目に変更します。

class ItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ('id', 'note', 'price',)

    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        self.fields['note'].required = True

最後に

ModelFormは他にも色々とカスタマイズ可能なので、調べてみてください。
今回の内容は私自身の備忘録の為に書きました。少しでも参考になれれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です