【问题标题】:How to raise custom error message via a django signal?如何通过 django 信号引发自定义错误消息?
【发布时间】:2018-10-21 19:58:45
【问题描述】:

我有模特

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

我需要在nums 字段中保存数字。但是,具有相同type 的myModel 的两个实例不能具有相同的数字(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 的调试窗口。我希望在那里显示错误。例如,当我们保存一个带有空字段的模型时,它会在红色突出显示的行中抛出“此字段是必需的”错误。我需要以这种方式显示错误。请提出一种方法。

谢谢!

【问题讨论】:

  • 使用form 验证

标签: django django-models django-signals


【解决方案1】:

正如@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2013-08-05
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多