如何在Django中自动大写表单提交字段?

时间:2012-08-16 23:40:06

标签: python django sorting django-models django-forms

我有一个ProductForm,用户可以使用Producttitleprice等信息向数据库添加condition

如何设置,以便在用户提交表单时,title字段的第一个字母会自动大写?

例如,如果用户在表单中键入“优质床垫”,django会将其保存为数据库中的“优质床垫”。

仅供参考,我问的原因是因为当我在页面上显示所有产品对象时,Django按标题排序的功能区分大小写。因此,“Bravo”,“糟糕”,“惊人”将被分类为“惊人”,“勇敢”,“可怕”作为用户,我们知道这不是按字母顺序排列。

感谢您的帮助!

6 个答案:

答案 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)

使用Python的capitalize() function

编辑:

请参阅Jeremy Lewis' answer有关使用此功能的位置。

:)

答案 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()