3

嗨,我是 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

我已经在管理员中对此进行了测试,并且确实在保存字段条目之前将其正确转换为小写。不幸的是,当我测试唯一性约束时,管理员没有优雅地处理完整性错误。如果从一开始就完全匹配,而不是像我一样得到干净的错误:

在此处输入图像描述

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

在此处输入图像描述

如何设置自定义字段,以便“尽早”捕获唯一约束以触发优雅错误,或者以其他方式修改管理员以便更优雅地处理此“稍后”错误?

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

更新:如果有人感兴趣,这是对我有用的修改后的代码:

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

1 回答 1

0

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

于 2015-07-01T18:16:28.187 回答