0

我的部分商业模式规定,某种类型的用户不能创建超过一定数量的“事物”。

让我用一些伪代码解释一下:

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

验证 a 的适当位置在哪里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

或者,您可以覆盖模型save()方法,或者您可以创建一个触发的信号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 回答