使用此方法,我可以将字段另存为小写,但这不会更改现有模型(即内存中(中的字段。
def get_prep_value(self, value):
value = super(LowercaseField, self).get_prep_value(value)
if value is not None:
value = value.lower()
return value
我很难弄清楚如何在不覆盖保存并在那里进行更改的情况下将此字段强制为小写。 但这拆分了此小写字段的逻辑。 我希望所有这些都在现场。 我应该覆盖什么,以便设置此值强制在内存中小写并在数据库中打开?
我不想更改表单,我想要字段类中包含的所有小写逻辑。
我找到了这样的部分解决方法:
def pre_save(self, model_instance, add):
""" Returns field's value just before saving. """
attr = getattr(model_instance, self.attname)
if attr is not None:
attr = attr.lower()
setattr(model_instance, self.attname, attr)
return attr
def get_prep_value(self, value):
value = super(LowercaseField, self).get_prep_value(value)
if value is not None:
value = value.lower()
return value
它有一点代码气味,并且在保存之前不处理检查值,但我看不出如何在不覆盖实际模型类上的 setattr 并在模型类本身内处理的情况下做到这一点。
您可以通过在 models.py 文件中添加以下代码来覆盖 Django 中的 "save" 方法
def save(self, *args, **kwargs):
self.yourfiled = self.yourfield.lower()
return super(ModelsName, self).save(*args, **kwargs)
当然,可以通过循环处理所有参数。
对于所有现有记录,您可以创建一个管理命令,该命令可以将所有字符串转换为小写以下是文档:编写自定义 django-admin 命令
如果您不想更改 Save 方法,只需在表单中添加"|lower"标记,该标记将在 UI 中将所有字符串转换为小写
{{ value|lower }}