formのcleanするときはcleaned_data返せば良い&forms.ModelFormはオーバーライドっぽくできる

まあ公式ドキュメント読めばいい

参考::フォームやフィールドのバリデーション — Django v1.0 documentation

具体例

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
公式ドキュメントにありましたね……でもサラッとかいてありすぎてこういう具体例のありがたみがわかりづらいかもしれない