在 Django 管理中的保存模型中构造条件



我有联系人模型,我想将其构造为只有 1 条字段 is_active=True 的记录。 但我不想引发错误,我希望它通知我,如果管理站点中有 is_active=True 的联系人记录,则不要保存记录。 "联系人不能同时拥有超过 1 个活动联系人。">

class Contact(models.Model):
name = models.CharField(max_length=30)
is_active = models.BooleanField(blank=True)
def save(self, *args, **kwargs):
if self.is_active:
if Contact.objects.filter(Q(is_active=True), ~Q(id=self.id)):
// raise ValidationError("Contact can't have more than 1 active contact at same time.")
return super(Contact, self).save(*args, **kwargs)

你需要使用 Django 信号钩子来拦截联系人的保存。这是确保不会插入错误数据的最佳方法,无论是来自管理站点还是其他地方。但是,为了确保它不会发生,您需要引发异常。

但是,若要使管理站点向用户显示适当的错误,需要覆盖控制器上的窗体。例如:

class ContactForm(forms.ModelForm):
class Meta:
model = Contact
def clean(self):
... do your validation here, raising forms.ValidationError as needed ...
return self.cleaned_data

class ContactAdmin(admin.ModelAdmin):
form = ContactForm

在自定义save函数中,只需在不执行请求的情况下返回错误,而不是抛出错误:

class Contact(models.Model):
name = models.CharField(max_length=30)
is_active = models.BooleanField(blank=True)
def save(self, *args, **kwargs):
if self.is_active:
if Contact.objects.filter(Q(is_active=True), ~Q(id=self.id)):
return
return super(Contact, self).save(*args, **kwargs)

最新更新