2

トランザクションのモデルフォームがあります。そのトランザクション モデルには、金額のフィールド (DecimaField) があります。1,000を入力しようとすると、データを保存できませんが、エラーは表示されず、更新されるだけです。モデルフォームにローカライズを入れようとしましたが、まだ許可されていません。

フォームがコンマ (1,000) を受け入れるようにするにはどうすればよいですか?

ここに私のコードがあります:

フォーム.py

class AddTransactionForm(forms.ModelForm):
    amount = forms.DecimalField(localize=True)

    class Meta:
        model = Transaction
        exclude = ('envelope', 'uid',)

    def __init__(self, user, *args, **kwargs):
        super(AddTransactionForm, self).__init__(*args, **kwargs)
        //other codes here

ビュー.py

完全に保存する前にビューでもコンマを置き換えようとしましたが、エラーが発生しました。

def transaction(request):   
    if request.method == 'POST':
        if request.POST['process'] == 'addtrans':
            tform = AddTransactionForm(request.user, 
                                       request.POST)
            if tform.is_valid():
                if request.POST['type'] == 'withdrawal':
                    trans = tform.save(commit=False)
                    trans.amount = 0 - trans.amount
                    trans.save()
                    messages.success(request,
                        "Transaction created successfully.")
                else:
                    trans = tform.save()
                    messages.success(request,
                        "Transaction created successfully.")

                if not trans.account:
                    env = Envelope.objects.get(
                        user=request.user,
                        name='Unallocated Income')
                    trans.envelope = env
                    trans.save()
                    env.amount += trans.amount
                    env.save()
                    messages.success(request, 
                        "Unallocate income save")               
                return HttpResponseRedirect(reverse('transactions:transaction'))    

    return render(request, 'trans_list.html', {
        .........
    })  

モデルを変更したくありません。フォームやビューに方法はありますか?

4

2 に答える 2

3

コンマがどのような意味を期待するかによって異なります。桁区切り記号として使用するか、ロケールベースの数値入力を有効にするか。

1000 ドル 23 セントを表す 10 進数について話しているとしましょう。

ロケールでは、これはまたは のように千単位の区切り文字を使用する場合en-usに表すことができます。一部のロケールではカンマを使用して小数点記号をマークするため、たとえば (ドイツ語) ロケールでは、この数値はまたはとして表すことができます。1000.231,000.23de-de1000,231.000,23

例からわかるように、コンマには 2 つの異なる意味があります。

フォーム フィールドに千単位の区切り文字を入力できるようにするには、ファイルでUSE_THOUSAND_SEPARATOR=Trueを設定しsettings.pyます。ロケールの場合、ユーザーは数値を入力したり、同じ数値を表すen-usことができます。ロケールでは、これにより千単位の区切り文字としてドットを入力できます。1,000.231000.23de-de

デフォルトの Django ロケールはen-us. 他のロケールもサポートし、ロケールに応じて異なる数値形式を入力したい場合はdjango.middleware.locale.LocaleMiddlewareMIDDLEWARE_CLASSES. このミドルウェアは、HTTPAccept-Languageリクエスト ヘッダーを確認し、リクエストごとにロケール設定をセットアップします。これにより、コードを変更することなく、ユーザーが独自のロケールで数字を入力できるようになります。

余談ですが、10 進数フィールドに対してエラーが表示されない場合は、ビュー コードにも問題がある可能性があります。たとえば、フォームが作成されても、誤ったコード パスが原因で への呼び出しis_valid()が行われない場合があります。結果の POST されたフォームは、エラーのリストが添付されていないフォームをレンダリングするだけです。

于 2013-03-11T00:05:36.677 に答える
2

あなたが説明した状況を処理するための迅速で汚い修正のためrequest.POSTに、ビューの先頭にある querydict をコピーし、入力から問題のあるコンマを削除し、調整した querydict をフォームコンストラクターに渡すことができます-

def transaction(request): 
    if request.POST.method == 'POST':
        post = request.POST.copy()
        if 'amount' in post:
            post['amount'] = pos['amount'].replace(',','')
        tform = AddTransactionForm(request.user, post)
        #...

( request.POST 辞書自体はimmutableであるため変更できません)。

于 2013-03-11T07:24:09.337 に答える