我有一个ProductForm
,用户可以使用Product
,title
和price
等信息向数据库添加condition
。
如何设置,以便在用户提交表单时,title
字段的第一个字母会自动大写?
例如,如果用户在表单中键入“优质床垫”,django会将其保存为数据库中的“优质床垫”。
仅供参考,我问的原因是因为当我在页面上显示所有产品对象时,Django按标题排序的功能区分大小写。因此,“Bravo”,“糟糕”,“惊人”将被分类为“惊人”,“勇敢”,“可怕”作为用户,我们知道这不是按字母顺序排列。
感谢您的帮助!
答案 0 :(得分:16)
表单有一个内置的钩子,用于清理特定字段(docs),这对于此代码来说是一个更清晰(双关语)的位置:
class ProductForm(forms.Form):
...
def clean_title(self):
return self.cleaned_data['title'].capitalize()
远比接受的答案少得多的代码,没有不必要的覆盖。
答案 1 :(得分:9)
你可以override the Model's save
method(它可以在一个地方简洁地处理多个字段):
class Product(models.Model):
...
def save(self, *args, **kwargs):
for field_name in ['title', 'price', ... ]:
val = getattr(self, field_name, False)
if val:
setattr(self, field_name, val.capitalize())
super(Product, self).save(*args, **kwargs)
答案 2 :(得分:2)
答案 3 :(得分:1)
如果您想确保数据一致,我不确定在表单/视图级别上大写是最好的方法。
当您通过管理员添加产品而不使用该表单/保存方法时会发生什么?如果您忘记了资本,那么您就会遇到数据不一致的问题。
您可以使用模型的保存方法,甚至使用django发送的pre_save信号。
这样,无论数据来自哪里,数据始终都是相同的。
答案 4 :(得分:0)
如果您需要所有单词的所有首字母大写以在杰里米·刘易斯的答案中使用val.title()
。如果您使用val.capitalize()
,则“ hello world”将为“ Hello world”,而使用title()
您将获得“ Hello World”
答案 5 :(得分:0)
您可以在模型中使用clean method,即:
class Product(models.Model):
title = models.CharField(max_length=30)
...
def clean(self):
self.title = self.title.capitalize()