在django admin

时间:2015-07-01 17:50:29

标签: python django django-models django-admin django-custom-field

您好我是django的新手,刚刚第一次尝试为我的模型使用自定义字段。我有一个Char字段,我希望始终将其保存为小写,因此我将其实现为自定义字段,如下所示(从另一个Stack Overflow帖子中学习):

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

我已在管理员中对此进行了测试,实际上字段条目在保存之前已正确转换为小写。不幸的是,当我测试唯一性约束时,管理员不能优雅地处理完整性错误。而不是像我一样得到干净的错误,如果它与get go的确切案例匹配:

enter image description here

我收到了丑陋的错误页面:

enter image description here

如何设置自定义字段,以便捕获唯一约束"早期"足以触发优雅的错误,或以其他方式修改管理员以便以后"以后"错误得到更优雅的处理?

(注意:我现在只使用sqlite3作为我的数据库)

更新: 如果有人感兴趣,请参阅以下修改过的代码:

class LowercaseCharField(CharField):
    def get_db_prep_value(self, value, connection, prepared=False):
         return value.lower()

1 个答案:

答案 0 :(得分:0)

我认为你不会通过覆盖pre_save来实现它,因为pre_save在唯一性验证发生后被调用。 尝试使用其他方法,例如get_db_prep_saveget_db_prep_value