2

これはかなり簡単なはずですが、Django のドキュメントからはわかりません。ModelForm フィールドを作成した IntegerField モデル フィールドがあります。問題のフィールドには $ 値 (価格) が含まれており、ユーザーが 10 ではなく $10 を入力したときにエラー メッセージ (「整数を入力してください」) が表示されなければ、UX の観点から望ましいでしょう。

手動でフォームのクリーニングを試みましたが、他の検証メソッドの後に clean_field メソッドが実行されているようです。これまでの私の読書もそれを確認しているようです。

    def clean_bill(self):
          bill = self.cleaned_data["bill"]
          if '$' in bill:
              bill=bill.replace('$','',1)   
          return bill

モデルフォームでIntegerFieldを維持しながら、これを回避する方法はありますか? RegexFieldにするだけですか?

EDIT:上記とRegexFieldの組み合わせで行きました。別の/より良い方法があるかどうか、まだ興味があります。

        bill= forms.RegexField(label=_("Bill"), max_length=10,required=True, regex=r'^\$?[\d]+$',
    error_messages = {'invalid': _("Please enter a whole number.")})
4

2 に答える 2

3

モデルにIntegerFieldを作成し、フォームにCharFieldを作成します。

modelformを使用してこれを行うことはできますが、次のことを行う必要があります。

  1. フォームからモデルフィールドを「除外」し、
  2. clean_billメソッドを次の形式で記述します
  3. モデルのフィールドの値を解析された整数値に設定します

これおよび/またはこれを試してください

于 2011-06-22T04:19:06.857 に答える
1

はい、あなたは正しいです。フォームとフィールドの検証に関するDjangoのドキュメントによると、それはあなたのメソッドにさえ行かず、最初のステップ(method )でcleanすでに発生します。フォームレベルでできることはあまりないと思います。ただし、フォームに渡す前にビュー内のデータを処理することができます。簡単な例:ValidationErrorto_pythonPOST

post_dict = request.POST.copy()   #makes a copy of request.POST so you can modify it
bill = post_dict['bill']
if '$' in bill:
    bill = bill.replace('$','',1)   
post_dict['bill'] = bill
# pass post_dict to your form instead of request.POST
...
于 2011-06-22T03:25:46.100 に答える