1

電話番号を尋ねるフォームがあります。[0-9] の数字のみがデータベースに保存されるようにする必要があります。

Django のドキュメントには次のように書かれています。

保存するとどうなりますか?

3) データベースのデータを準備します。各フィールドは、データベースに書き込むことができるデータ型で現在の値を提供するよう求められます。

これはどのように起こりますか?より具体的には、これが確実に消去されるようにするにはどうすればよいですか? モデルの保存方法をオーバーライドできることはわかっていますが、もっと良い方法があるようで、その方法がわかりません。

カスタム フィールドを作成できると思いますが、ここではやり過ぎのようです。

また、フォームにバリデーションを入れることはできると思いますが、モデルに属する文字を削除するのは本当に気分が悪いです。

4

3 に答える 3

2

特にポイント3に関するあなたの質問は、djangoが用語を使用する方法で「クリーニング」とは少し異なります。

3) データベースのデータを準備します。各フィールドは、データベースに書き込むことができるデータ型で現在の値を提供するよう求められます。

ポイント 3 は、python オブジェクトの値をデータベースに適した値に変換することです。具体的には、これはField.get_prep_valueおよびで行われます。Field.get_db_prep_value

https://docs.djangoproject.com/en/dev/howto/custom-model-fields/#django.db.models.Field.get_prep_value

to_pythonこれは、DB 値を受け取り、それを Python オブジェクトに変換するのとは逆です。

0 ~ 9 の数字のみが格納されるようにすることについては、Fieldscleanメソッド (サブクラス IntegerField)、フォームcleanメソッド、フォームclean_FIELDNAMEメソッド、またはモデルで行われcleanます。

于 2012-04-27T23:44:02.370 に答える
1

カスタム フォーム クリーニング メソッドをオブジェクト モデルに追加できます。この記事をご覧ください https://docs.djangoproject.com/en/dev/ref/forms/validation/#form-field-default-cleaning

「特定のフィールド属性のクリーニング」を見てください

于 2012-04-27T23:29:31.140 に答える
0

django モデル フォーム+カスタム フォーム フィールドのクリーニングを使用する

以下は、探しているものの簡単な例です。MyModel電話番号フィールドを含むモデルはどこにあり、telここで名前を付けました。

import re

class MyForm(ModelForm):
    class Meta:
        model = MyModel

    def clean_tel(self):
        tel = self.cleaned_data.get('tel', '')  # this is from user input

        # use regular expression to check if tel contains only digits; you might wanna enhance the regular expression to restrict the tel number to have certain number of digits.
        result = re.match(r'\d+', tel)  
        if result:
            return tel  # tel is clean so return it
        else:
            raise ValidationError("Phone number contains invalid character.") 
于 2012-04-27T23:34:17.747 に答える