7

我有一个ProductForm用户可以在其中Product向数据库添加title,pricecondition.

如何使当用户提交表单时,该title字段的第一个字母自动大写?

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

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

谢谢您的帮助!

4

6 回答 6

22

表单具有用于清理特定字段 ( docs )的内置钩子,这将是此代码的更清洁(双关语)位置:

class ProductForm(forms.Form):
    ...
    def clean_title(self):
        return self.cleaned_data['title'].capitalize()

比接受的答案少得多的代码,并且没有不必要的覆盖。

于 2012-08-17T07:05:36.267 回答
13

您可以覆盖模型的save方法(它的好处是能够在一个地方简洁地处理多个字段):

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)
于 2012-08-17T00:13:52.173 回答
2

使用 Python 的capitalize()函数

编辑:

请参阅Jeremy Lewis关于在何处使用此功能的回答。

:)

于 2012-08-16T23:57:30.203 回答
1

如果你想确保你的数据是一致的,我不确定在表单/视图级别大写是最好的方法。

当您通过管理员添加产品而不使用该表单/保存方法时会发生什么?如果您忘记了资本,那么您将面临数据不一致的问题。

您可以改为使用模型的保存方法,甚至使用 django 发送的 pre_save 信号。

这样一来,无论数据来自何处,数据总是被同等对待。

于 2012-08-17T07:18:32.590 回答
1

您可以在模型中使用clean 方法,即:

class Product(models.Model):
    title = models.CharField(max_length=30)
    ...
    def clean(self):
        self.title = self.title.capitalize()
于 2019-10-27T05:09:32.783 回答
0

如果您需要所有单词的所有首字母来大写val.title()Jeremy Lewis 的回答中的使用。如果你使用val.capitalize(),那么“hello world”将是“Hello world”,title()你可以得到“Hello World”

于 2019-08-07T23:32:59.373 回答