如何允许用户输入逗号

时间:2013-03-10 09:56:43

标签: django

我有一个交易模型。该事务模型具有金额字段(DecimaField)。当我尝试输入 1,000 时,它不允许我保存数据但没有显示错误,它只是刷新。我尝试将localize放在模型中,但它仍然不允许我。

如何让表单接受逗号(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', {
        .........
    })  

我不想修改我的模型。表格或观点中有没有办法?

2 个答案:

答案 0 :(得分: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()。生成的POSTed表单只会呈现一个没有附加错误列表的表单。

答案 1 :(得分: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)。