1

我已经为一个项目组装了一个基本的 CMS 系统,并且我正在添加一个订单系统,以便您可以在导航栏中对创建的页面进行排序。不幸的是,我编写的自定义验证器有点激进,并且在您编辑页面时会引发错误,因为正确地,该订单已经存在于数据库中。

表单基于的模型:

class Page(models.Model):
page_name = models.CharField(max_length=100)
page_content = models.CharField(max_length=16777000)
link = models.URLField(blank=True)
order = models.IntegerField()

自定义验证器:

def clean_order(self):
    data = self.cleaned_data['order']
    pg = Page.objects.filter(order=data)
    if pg.count() > 0:
        raise forms.ValidationError("This order number already exists. Use another.")
    return data

在执行更新时,我有什么办法让自定义验证器仅在新订单已经存在但不是当前页面对象的情况下引发错误。就像是:

pg = Page.objects.filter(order=data).filter(pk!=editpagepk)

谢谢!

4

3 回答 3

3

使用exclude方法,如下所示:

pg = Page.objects.filter(order=data).exclude(pk=self.instance.pk)
于 2013-02-07T22:01:26.997 回答
1

使用 Django查询集exclude从结果中排除当前对象。假设您id在模型中有一个字段Page充当主键:

def clean_order(self):
    order = self.cleaned_data['order']
    pg = Page.objects.filter(order=order).exclude(id=self.instance.id)
    if pg.count() > 0:
        raise forms.ValidationError(" ... ")
    return data

以上假设您使用的是 ModelForm,因为这是您需要找到通过 POST 提交的当前对象实例的内容self.instance。关于最后一点的更多细节在这里

于 2013-02-07T22:04:13.333 回答
0

我想您可以尝试查询匹配的对象并捕获异常:

try:
    Page.objects.filter(order=data).get(pk=editpagepk)
except Page.DoesNotExist:
    raise forms.ValidationError("...")
于 2015-01-23T18:23:33.657 回答