2013-03-10 51 views
2

我有一個交易模型。該交易模型有一個金額字段(DecimaField)。當我嘗試輸入1,000它不允許我保存數據,但沒有顯示錯誤,它只是刷新。我嘗試把本地化的模式,但它仍然不允許我。如何讓用戶輸入逗號

如何讓表單接受逗號(1,000)?

這裏是我的代碼:

forms.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 

views.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', { 
     ......... 
    }) 

我不想修改我的模型。有形式或意見的方式嗎?

+0

也許這個http://stackoverflow.com/questions/3203089/make-django-forms-use-comma-as-decimal-separator會有幫助嗎? – 2013-03-10 10:08:04

+0

@EllochkaCannibal我已經試過,但沒有效果。也許在Django 1.4中有變化 – catherine 2013-03-10 10:10:52

+0

請顯示您的整個視圖代碼。錯誤未呈現的事實表明您的視圖中存在問題。該錯誤消息可能指示除逗號之外的錯誤,例如以不正確的精度輸入的數字。 – 2013-03-10 10:14:34

回答

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)。

+0

哇,它的工作。最後一個問題,這是安全的嗎? – catherine 2013-03-11 07:30:07

+0

它沒有引入任何新的安全風險(雖然這不是一個好的方法 - 只有在沒有時間處理帶有本地設置的模型中的輸入時纔會這樣做)。 – 2013-03-11 07:35:00

3

這取決於您期望逗號的含義。它被用作千位分隔符,還是要啓用基於區域的數字輸入?

我們假設我們正在談論一個十進制數字,代表一千美元和二十三美分。

en-us區域設置中,這可以由1000.23或使用千位分隔符作爲1,000.23時表示。例如,某些語言環境使用逗號來標記小數點分隔符,例如de-de(德語)語言環境,此數字可能表示爲1000,231.000,23

正如您在示例中看到的,逗號可以有兩個單獨的含義。

如果要允許在表單域中輸入千位分隔符,請在settings.py文件中設置USE_THOUSAND_SEPARATOR=True。如果在en-us區域設置中,用戶將能夠輸入號碼1,000.231000.23以表示相同的號碼。在de-de區域設置中,這將允許爲千位分隔符輸入一個點。

默認的Django語言環境是en-us。如果您還想支持其他區域設置並根據區域設置輸入不同的數字格式,則必須將django.middleware.locale.LocaleMiddleware添加到MIDDLEWARE_CLASSES。該中間件將查看HTTP Accept-Language請求標頭並根據每個請求設置區域設置,允許用戶在自己的區域設置中輸入數字,而無需對代碼進行任何更改。另外,如果你的小數域沒有出現錯誤,那麼你的視圖代碼中也可能有問題。例如,可能會創建表單,但由於錯誤的代碼路徑,不會對is_valid()進行調用。生成的POST表單將只顯示一個沒有附加錯誤列表的表單。

+0

+1的解釋。我會在稍後嘗試,如果它有效,我會標記你的答案。昨天,我嘗試了許多編碼,只是爲了解決我的問題,但沒有發生,所以我希望你的回答能起作用:) – catherine 2013-03-11 00:31:59

+0

對不起,它不起作用,呵呵......當系統驗證DecimalField時,它不允許逗號通過。 – catherine 2013-03-11 03:51:12

+0

@catherine你有[USE_L10N = True](https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n)嗎?什麼是顯示的形式錯誤? – 2013-03-11 03:55:11