2

私はこれまでに尋ねられたことを理解していますが、私がしようとしていることを実際に扱った質問は見つかりませんでした。私はそれがかなりシンプルだと思いますが、私は一般的な人口がここで一番良いと思うものを知りたいと思います。Djangoモデルはsave/signalを使用してオーバーライドしますか、またはmodelformを使用しますか?

私たちは次のことを考えてみましょう:

models.py

class TestClass(models.Model): 
    user = models.ForeignKey(User) 
    testfield = models.CharField() 
    testbool = models.BooleanField(default=False) 

def save(self, *args, **kwargs): 
    """ 
    - what we're trying to do here is ensure that the User doesn't have more than 
     X (lets say 5) related test fields. 
    - what if we also wanted to add validation to testfield to ensure it was 
     only [a-zA-Z]? 
    """ 
    if TestClass.objects.filter(user=self.user).count() >= 5: 
     # How do we exit gracefully? 
     return 
    super(TestClass, self).save(*args, **kwargs) 

保存機能はかなりの合計のコメントまで私の質問: - どのように我々はより存在しないことを確実にするでしょう5つの関連するTestClassを与えるユーザ - すでに保存されている場合は、保存せずに正常に終了するにはどうすればいいですか? - これをユーザにどのように報告しますか? - testfieldオブジェクトが[a-z]のみを持つことを確認するためにtestfieldオブジェクトを検証しますか?私はちょうど再インポートし、ここでそれを行うことはできますか? ですか?

ここにすべてを投げるのが最善でしょうか?私はpre_save信号を発射すべきですか?または、私はちょうどModelFormを使用して/検証を使用する必要がありますか?

答えて

0

現在のところ、これを実行する明白な場所はありません。そのため、モデルレベルの検証を追加するためのSummer of Codeプロジェクトがあります。これにより、このようなことをすばやく簡単に行うことができます。

残念ながら、数ヶ月間は準備ができません。その間、あなたの答えはデータの追加方法によって異なります。それはプログラム的に行われるのだろうか、それとも常にフォームを通じて行われるのだろうか?後者の場合は、フォームに検証を入れることが必要です(同じモデルフォームまたはそのサブクラスを管理者ビューと独自のビューで使用できるため、ロジックを複製する必要はありません)。

+0

私はこれを管理者に使用すると、管理者が行う標準的な検証を上書きしますか(別名ブランク= False、適切な日付など)? また、 save()をオーバーライドしたい場合は、そこから抜ける最善の方法は何ですか?私は例外を発生させることはおそらく悪いと仮定しています...だから、私はちょうどFalseを返すのか、理由を与えないのでしょうか? – lostincode

+0

実際のフィールドを再定義しない限り、デフォルトの検証は通常どおり動作します。保存するために、何も返す必要はないので、返すだけで問題ありません。 –

関連する問題