7

ユーザーが、、、などの情報を使用してデータベースにをProductForm追加できる場所があります。Producttitlepricecondition

titleユーザーがフォームを送信するときに、フィールドの最初の文字が自動的に大文字になるようにするにはどうすればよいですか?

たとえば、ユーザーがフォームに「Excellent mattress」と入力すると、djangoはそれを「Excellentmattress」としてデータベースに保存します。

参考までに、私が尋ねる理由は、ページにすべての製品オブジェクトを表示するときに、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メソッドをオーバーライドできます(1つの場所で多数のフィールドを簡潔に処理できるという利点があります)。

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()関数を使用します。

編集:

この関数を使用する場所については、JeremyLewisの回答を参照してください。

:)

于 2012-08-16T23:57:30.203 に答える
1

データの一貫性を確保したい場合は、フォーム/ビューレベルでの大文字化が最善の方法かどうかはわかりません。

そのフォーム/保存方法を使用していない管理者を介して製品を追加するとどうなりますか?大文字を忘れると、データの不整合が発生します。

代わりに、モデルのsaveメソッドを使用することも、djangoが送信するpre_saveシグナルを使用することもできます。

このように、データはどこから来たかに関係なく、常に同じように扱われます。

于 2012-08-17T07:18:32.590 に答える
1

モデルでクリーンな方法を使用できます。つまり、次のようになります。

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()と、「helloworld」は「Helloworld」になり、「HelloWorld」title()を取得できます。

于 2019-08-07T23:32:59.373 に答える