formのcleanするときはcleaned_data返せば良い&forms.ModelFormはオーバーライドっぽくできる
まあ公式ドキュメント読めばいい
具体例
class HogeForm(forms.ModelForm): # intのフィールド hoge_int = forms.IntegerField(label=u'番号', required=False) # char のフィールド moge_char = forms.CharField(label=u'文字列', max_length=100, required=False) #単一のフォームのバリデーションチェックをする def clean_hoge_int(self): """hoge_intをバリデーションする """ hoge_int = self.cleaned_data['hoge_int'] if not 1 <= hoge_int <= 10: raise forms.ValidationError(u"1-10の範囲で入力してください") return hoge_int #複数フィールドにまたがるバリデーション def clean(self): """ 番号か文字列のどちらかを必須にする """ hoge_int = self.cleaned_data['hoge_int'] moge_char = self.cleaned_data['moge_char'] if not hoge_int and not moge_char: raise forms.ValidationError("番号か文字列のどちらかは必須です") # cleaned_dataをかえせばよい return self.cleaned_data class Meta: model = Hoge fields = ( 'id', 'key', 'hoge_int', 'moge_char', )
まあコメントに書いたのでだいたい分かると思う。単一のフィールドは clean_hoge()というようなかきかたをして、複数のフィールドをまたがる場合 clean()にすればよい。
forms.ModelFormがオーバーライドっぽく振る舞ってくれる話
form はそれぞれ上の例でも hoge_int や moge_char は views.py あたりで受け取って改めて save() なりする必要があるのだけど、ModelForm と同じ名称でつくってやるとその必要はない。つまり、 ModelForm という Model で勝手に Form を作ってくれる機能にタダ乗りしてバリデーションチェックをかけられるわけ。便利!
ちなみに class Hoge は以下の様な想定です
class Hoge(models.Model): id = models.IntegerField() key = models.CharField(max_length=100) hoge_int = models.IntegerField() moge_char = models.CharFiled(max_length=100)
そのまま forms.ModelForm で生成すると required=True のデフォルト状態になってしまうし、例えばCSSのclassを付け加えたい時は widget=... とするわけで、オーバーライドできると便利だね、という話。
というか
モデルからフォームを生成する — Django v1.0 documentation
公式ドキュメントにありましたね……でもサラッとかいてありすぎてこういう具体例のありがたみがわかりづらいかもしれない