2013-03-10 81 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