0

私のビジネス モデルの一部では、特定のタイプのユーザーは特定の数を超える「もの」を作成できないことが規定されています。

いくつかの疑似コードで説明しましょう:

class Thing(Model):
     owner = ForeignKey(User)

ユーザーがモノFormを作成できないように、を検証する適切な場所はどこですか?nth + 1

4

2 に答える 2

3

clean()フォームのメソッドに追加できます。

class ThingForm(forms.ModelForm):
    def clean(self, *args, **kwargs):
        cleaned_data = super(ThingForm, self).clean()
        owner = cleaned_data.get("owner")
        other_things_count = Things.objects.filter(owner=owner).count()
        if other_things_count >= 20:
            raise forms.ValidationError("Too many things!")
        return cleaned_data

または、modelssave()メソッドを上書きするか、で発生するシグナルをpre_save作成することもできますが、どちらも検証メッセージをフォームに関連付けることができないため、上記の方法が最適だと思いますclean()

編集編集を除外する場合ModelFormは、instanceに、つまり既存のオブジェクトがあるかどうかを確認できます。

other_things_count = Things.objects.filter(owner=owner).exclude(pk=self.instance.pk).count()
于 2012-08-11T14:29:32.013 に答える
1

次の場所のいずれかで例外を発生させることを検討できます。

例外を発生させるサンプル コード:

if myThing.pk is None and myThing.owner.thing_set.count() > n:
     # here raise your exception:
     raise ValidationError("Too many things!")
于 2012-08-11T14:39:46.917 に答える