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

这取决于您希望逗号具有什么含义。它是用作千位分隔符,还是要启用基于区域设置的数字输入。

假设我们谈论的是代表一千美元和二十三美分的十进制数。

en-us语言环境中,这可以通过1000.23或使用千位分隔符作为1,000.23. 某些语言环境使用逗号来标记小数点分隔符,因此例如在de-de(德语)语言环境中,此数字可以表示为1000,231.000,23

从示例中可以看出,逗号可以有两种不同的含义。

如果要允许在表单字段中输入千位分隔符,请在文件中设置USE_THOUSAND_SEPARATOR=True 。settings.py如果在en-us区域设置中,用户将能够输入数字1,000.231000.23表示相同的数字。在de-de语言环境中,这将允许为千位分隔符输入一个点。

默认的 Django 语言环境是en-us. 如果您还想支持其他语言环境并根据语言环境输入不同的数字格式,则必须添加django.middleware.locale.LocaleMiddleware到您的MIDDLEWARE_CLASSES. 该中间件将查看 HTTPAccept-Language请求标头并根据每个请求设置区域设置,允许您的用户在自己的区域设置中输入数字,而无需您对代码进行任何更改。

顺便说一句,如果您的十进制字段没有出现错误,那么您的视图代码可能也有问题。例如,可能创建了表单,但由于错误的代码路径,is_valid()没有进行调用。然后,生成的 POSTed 表单将只呈现一个没有附加错误列表的表单。

于 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 字典本身,因为它是不可变的)。

于 2013-03-11T07:24:09.337 回答