Как поднять пользовательское сообщение об ошибке через сигнал django? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть модель

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

Мне нужно сохранить числа в поле nums. Но никакие два экземпляра myModel, которые имеют одинаковые 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. Я хочу, чтобы ошибка отображалась прямо здесь. Например, когда мы сохраняем модель с пустым полем, и она выдает ошибку, говорящую «Эта строка обязательна» в выделенной красным цветом строке. Мне нужно, чтобы отобразить ошибку таким образом. Пожалуйста, предложите способ.

Спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Как сказал @AnjaneyuluBatta в комментарии, вы можете переместить этот вид проверки в форму. См. Добавление пользовательской проверки к документации администратора . Ваш 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)
...