Как разрешить отправку формы, но запретить сохранение пустых полей с помощью Django Admin 3.x?

#django #django-admin

#django #django-admin

Вопрос:

Я использую Django Admin, и у меня есть такая модель:

 class Item(models.Model):

    id = models.CharField(max_length=14, primary_key=True)
    otherId = models.CharField(max_length=2084, blank=True)
  

Я хочу, чтобы идентификатор был обязательным и уникальным, и я хочу, чтобы otherId был необязательным в форме администратора, но если указан otherId, он должен быть уникальным.

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я создаю экземпляр Item с помощью формы администратора и не указываю otherId, Django пытается сохранить поле otherId как пустое значение, но это означает, что во второй раз, когда я пытаюсь сохранить экземпляр с пустым значением otherId, он нарушает столбецуникальное ограничение и сбой.

Мне нужно, чтобы Django проверил, является ли поле otherId ложным перед сохранением, и если оно ложное, не сохраняйте это пустое значение вместе с моделью. Возможно ли это?

Ответ №1:

Вы должны добавить unique=True в поле otherId .

 otherid = models.CharField(max_length=2084, blank=True, null=True, unique=True)
  

Django игнорирует уникальный или нет, если otherId пуст.

Комментарии:

1. Спасибо, установка null= True в моем случае фактически приводит к возможности отправки формы с учетом моей схемы БД (которая поддерживается за пределами Django). Однако я искал, чтобы узнать, как изменить запрос сохранения, чтобы я мог выборочно предотвращать сохранение ключей, если они имеют ложное значение.

Ответ №2:

Я не очень хорошо понял вопрос, но я думаю, вам нужно переопределить метод сохранения модели django и предоставить пользовательскую логику, указанную вами выше.

 class Item(models.Model):
    id = models.CharField(max_length=14, primary_key=True)
    otherId = models.CharField(max_length=2084, blank=True)
    def save(self, *args, **kwargs): 
        
        # handle you logic here 
        # check if self.id is empty string and do something about it
        super(Item, self).save(*args, **kwargs)
  

Для каждой модели django также автоматически создает идентификатор поля для первичного ключа, который автоматически генерируется и увеличивается.

Комментарии:

1. Это в основном то, что я ищу, но я не могу понять, как предотвратить сохранение ключа, когда его значение равно falsey. У меня есть это: « def save(self, * args, ** kwargs): если не self.otherId: delattr(self, ‘otherId’) super(Item, self).save(*args, ** kwargs) « Но это приводит к ошибке «Запрос на сопоставление элементов не существует». ошибка при попытке сохранения без указания otherId. Есть идеи, как обойти это? Извините за запутанный вопрос.

Ответ №3:

Для отключения отправки пустого поля вы должны присвоить свойству null и blank значение False . Проверьте код. Также обратите внимание, что поле id автоматически добавляется в django, поэтому вам не нужно об этом упоминать.

 class Item(models.Model):
    otherId = models.CharField(max_length=2084, blank=False, null=False)
  

Комментарии:

1. На самом деле я не хочу требовать отправки otherId. Похоже, что добавление null=True фактически привело к тому поведению, которое я искал. Извините за запутанный вопрос.