построить условие в модели сохранения в django admin - PullRequest
0 голосов
/ 16 июня 2020

У меня есть модель контакта, и я хочу создать в ней только 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)

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Вы захотите использовать хук Django Signals , чтобы перехватить сохранение контакта. Это лучший способ убедиться, что ошибочные данные не вставлены ни с сайта администратора, ни откуда-то еще. Однако, чтобы этого не произошло, вам нужно будет вызвать исключение.

Однако, чтобы сайт администратора отображал соответствующую ошибку для пользователя, вам нужно переопределить форму на контроллере . Например:

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
0 голосов
/ 16 июня 2020

В пользовательской функции 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...