【问题标题】:How to automatically capitalize field on form submission in Django?如何在 Django 中自动大写表单提交的字段?
【发布时间】:2012-08-13 09:08:39
【问题描述】:

我有一个ProductForm,用户可以将Product 添加到数据库中,其中包含titlepricecondition 等信息。

如何让用户提交表单时,title字段的首字母自动大写?

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

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我还希望上面的表单清理方法覆盖保存方法。这不就是 clean 方法的用途吗?
    • 例如,如果您需要在模型中大写 10 个字段,则不需要。正如原始问题中所指定的那样,覆盖 save 方法可以让您轻松地一次对多个字段执行大写操作。也就是说,我同意在单个字段的情况下,使用clean_ 方法更快
    • 不是说要返回原来的self.cleaned_data['title']吗? “这个方法应该返回从cleaned_data获得的清理值,不管它是否改变了任何东西。” (docs.djangoproject.com/en/1.9/ref/forms/validation/…)
    【解决方案2】:

    您可以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)
    

    【讨论】:

    • 只是为了澄清/学习,这个保存方法会覆盖默认保存方法,例如我必须编写保存方法的“剩余组件”吗? IE。如果我使用此保存方法来指定它应该在保存时将“标题”字段大写,我是否必须编写其他任何内容以确保产品对象正确保存?
    • 不,super(Product, self).save(*args, *kwargs) 行负责处理(它调用父级的保存方法 - 换句话说,在执行您的自定义代码后照常执行保存)
    • *args 和 *kwargs 到底是什么?我需要指定这些参数吗?我现在把它们留空了,它似乎正在工作......
    • 它们是位置参数和关键字参数:saltycrane.com/blog/2008/01/…
    • 危险的错字:它是(*args, **kwargs),而不是(*args, *kwargs)。有区别!固定。
    【解决方案3】:

    使用 Python 的capitalize() function

    编辑:

    请参阅Jeremy Lewis' answer,了解在何处使用此功能。

    :)

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

        你可以在模型中使用clean method,即:

        class Product(models.Model):
            title = models.CharField(max_length=30)
            ...
            def clean(self):
                self.title = self.title.capitalize()
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-21
            • 2012-04-16
            • 2011-08-12
            • 2021-11-09
            • 2011-07-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多