2009-09-24 12 views
11

モデルのsaveメソッドで例外を発生させる必要があります。私は、管理フォームを含むこのモデルを使用する任意のdjango ModelFormによってキャッチされる例外が存在することを望んでいます。djangoモデルのsaveメソッドからValidationErrorを呼び出す?

私はdjango.forms.ValidationErrorを上げようとしましたが、これは管理者のフォームには見当たらないようです。モデルは保存時にリモートプロシージャコールを行い、入力が有効であればこのコールまでは知られていません。

おかげで、ピート

答えて

8

現在のメソッド保存モデルで検証を実行する方法はありません。しかし、これは別個のモデル検証ブランチとして開発されており、今後数ヶ月でトランクに統合されるべきです。

一方、フォームレベルで検証する必要があります。 ModelFormサブクラスを作成してclean()メソッドを呼び出すことは非常に簡単です。これはリモート呼び出しを行い、それに応じて例外を発生させます。これを管理者と他のフォームの両方のベースとして使用します。

+3

最近、djangoが私を打ち負かしています。私はこのアプローチで行ったが、私は満足していない。モデルを変更するコードは、クリーンな方法ではありません。 – slypete

+0

ちょうどチェックインしました、あなたが話したこのブランチはまだマージされていますか? – rennat

+5

これはDjango 1.2の一部です:http://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects – Tom

10

は、Djangoの1.2ので、これは私が行ってきたものです:

class MyModel(models.Model): 

    <...model fields...> 

    def clean(self, *args, **kwargs): 
     if <some constraint not met>: 
      raise ValidationError('You have not met a constraint!') 
     super(MyModel, self).clean(*args, **kwargs) 

    def full_clean(self, *args, **kwargs): 
     return self.clean(*args, **kwargs) 

    def save(self, *args, **kwargs): 
     self.full_clean() 
     super(MyModel, self).save(*args, **kwargs) 

これは、両方の内側と管理の外で働くことの利点を持っています。

関連する問題