如何通过django信号引发自定义错误消息?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过django信号引发自定义错误消息?相关的知识,希望对你有一定的参考价值。

我有一个模特

class myModel(models.Model):
   name = models.CharField(max_length=100)
   type = models.CharField(max_length=100)
   nums = JSONField(null=True, blank=True)

我需要在nums字段中保存数字。但是,没有两个具有相同myModelcan的type实例具有相同的数字(nums字段的交集应该为空)。

我试过为它写一个信号

@receiver(pre_save, sender = myModel)
def check_duplicate_nums(sender, instance, **kwargs):
   all_records = myModel.objects.filter(type = instance.type)
   for record in all_records:
      common_nums = list(set(record.nums).intersection(instance.nums))
      if len(common_nums) != 0:
         raise Exception("nums "+str(common_nums)+ " are repeated in " +str(record.name)+ " and "+instance.name)

但这样做会打开django admin的调试窗口。我希望错误显示在那里。例如,当我们使用空字段保存模型时,它会在红色突出显示的行中抛出错误“此字段是必需的”。我需要以这种方式显示错误。请建议一个方法。

谢谢!

答案

正如@AnjaneyuluBatta在评论中所说,你可以将这种验证移到表单中。请参阅Adding custom validation to the admin文档。你的admin.py应该是这样的:

class MyForm(forms.ModelForm):
    class Meta:
        model = myModel

    def clean_nums(self):
        # do something that validates your data
        nums = self.cleaned_data["nums"]
        all_records = myModel.objects.filter(type = instance.type)
        for record in all_records:
            common_nums = list(set(record.nums).intersection(instance.nums))
            if len(common_nums) != 0:
                raise forms.ValidationError("nums "+str(common_nums)+ " are repeated in " +str(record.name)+ " and "+instance.name)
        return nums

class MyAdmin(admin.ModelAdmin):
    form = MyForm

admin.site.register(MyModel, MyAdmin)

以上是关于如何通过django信号引发自定义错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

Django,自定义身份验证登录。身份验证失败时如何显示错误消息?

如何在 Django 的自定义 404 错误模板中显示传递给 Http404 的消息?

JWT:如何在密码或用户名错误 Django REST 上实现我的自定义错误消息

Django - 异常处理最佳实践和发送自定义错误消息 [关闭]

使用自定义错误处理程序时如何从中止命令访问错误消息

Cassandra 用户定义类型上的 Django Queryset 引发类型错误