Обработка уникального ограничения для настраиваемого поля в админке django
Привет, я новичок в django и только что начал свой первый набег на использование настраиваемого поля для моей модели. У меня есть поле Char, которое я хочу всегда сохранять в нижнем регистре, поэтому я реализовал его как пользовательское поле следующим образом (узнал из другого поста переполнения стека):
from django.db import models
from django.db.models.fields import CharField
class LowercaseCharField(CharField):
def pre_save(self, model_instance, add):
current_value = getattr(model_instance, self.attname)
setattr(model_instance, self.attname, current_value.lower())
return getattr(model_instance, self.attname)
class Item(models.Model):
name = LowercaseCharField(max_length=50, unique=True)
def __str__(self):
return self.name
Я проверил это в админке, и действительно, запись поля корректно преобразуется в нижний регистр перед сохранением К сожалению, когда я тестировал ограничение уникальности, администратор не корректно обрабатывал ошибку целостности. Вместо того, чтобы получить чистую ошибку, как я, если она точно соответствует регистру с самого начала:
Я получаю ужасную страницу с ошибкой:
Как мне настроить настраиваемое поле таким образом, чтобы уникальное ограничение перехватывалось достаточно рано, чтобы вызвать изящную ошибку, или иным образом изменить администратора, чтобы эта более поздняя ошибка была обработана более изящно?
(Примечание: я просто использую sqlite3 для моей базы данных)
ОБНОВЛЕНИЕ: В случае, если кто-то заинтересован, вот модифицированный код, который работал для меня:
class LowercaseCharField(CharField):
def get_db_prep_value(self, value, connection, prepared=False):
return value.lower()
1 ответ
Я не думаю, что вы сделаете это, переопределив pre_save
, так как pre_save
вызывается после проверки уникальности. Попробуйте с другими методами, такими как get_db_prep_save
или же get_db_prep_value
,