2012-04-27 9 views
1

私は電話番号を要求するフォームを持っています。私は数字[0-9]だけがデータベースに保存されることを確認する必要があります。ジャンゴdocumentationDjangoモデル - データベースのデータを準備する

それは言う:あなたが保存したときに起こる

何?

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

どうしますか?または、具体的には、これをきれいにするにはどうすればいいですか?モデル保存メソッドをオーバーライドできますが、より良い方法があるように思えますし、どうやって行うのか分かりません。

私はカスタムフィールドを書くことができると思いますが、ここでは過剰なようです。

また、私はフォームにバリデーションを入れることができますが、実際にはモデル上にある文字を取り除くように感じます。

あなたのオブジェクトモデルにカスタムフォームのクリーニング方法を追加することができます

答えて

2

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

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

ポイント3は、Pythonのオブジェクト値をデータベースに適した値に変換することについてです。具体的には、これは、それがDBの値をとり、Pythonオブジェクトに変換to_pythonの反対だField.get_prep_valueField.get_db_prep_value

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

で行われます。

のみ数字0-9を確保するように、Field S clean方法(サブクラスIntegerFieldと)で行われることを、フォームclean方法、フォームclean_FIELDNAME方法、またはモデルcleanに格納されます。

1

-

0

使用以下django model form + custom form field cleaning

「特定のフィールド属性のクリーニング」でhttps://docs.djangoproject.com/en/dev/ref/forms/validation/#form-field-default-cleaning

見て、この記事を見てみましょうあなたが探しているものの簡単な例です。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.") 
関連する問題