Изменение значения поля, если вход не находится в выборе Django ImportExportModelAdmin

У меня есть это поле модели в качестве примера:

compliance_approve_status = models.CharField(max_length=200, blank=True, null=True, default=None, choices=review_status_choices)

с этими вариантами:

for_review = 'FOR REVIEW'
approved = 'APPROVED'
rejected = 'REJECTED'
review_status_choices = [(for_review, 'FOR REVIEW'), (approved, 'APPROVED'), (rejected, 'REJECTED')]

Упрощенная версия полей с выбором.

Я хочу иметь возможность сделать значение по умолчанию, в котором, если пользователь импортирует из файла и помещает что-то, кроме "FOR REVIEW", "APPROVED" или "REJECTED", или является NULL, то по умолчанию будет None. Я думал, что добавление default=None сделает это, но в Django принимаются другие значения ImportExportModelAdmin.

enter image description here

enter image description here

enter image description here

Должно работать что-то вроде этого (не проверено):

class ComplianceStatusWidget(widgets.CharWidget):
    def clean(self, value, row=None, *args, **kwargs):
        if not value:
            return None
        for status, text in models.YourModel.review_status_choices:
            if value.strip().lower() == text.lower():
                return text
        return None

Некоторые усовершенствования этого:

  1. Рассмотрите возможность использования поля Choices в вашей модели. Затем вы можете использовать widget в вашем HTML, чтобы избежать дублирования.

  2. Рассмотрите возможность передачи вариантов выбора в виджет с помощью конструктора для лучшего разделения логики. Это поможет вам повторно использовать виджет в других контекстах.

    .
  3. Код выше не чувствителен к регистру, что может быть не то, что вам нужно.

Вернуться на верх