我有一个交易模型。该事务模型具有金额字段(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', {
.........
})
我不想修改我的模型。表格或观点中有没有办法?
答案 0 :(得分:3)
这取决于您对逗号的期望。它是用作千位分隔符,还是要启用基于区域设置的数字输入。
我们假设我们正在谈论代表一千美元和二十三美分的十进制数字。
在en-us
语言环境中,这可以由1000.23
表示,或者使用千位分隔符1,000.23
表示。某些区域设置使用逗号来标记小数分隔符,因此在de-de
(德语)区域设置中,此数字可以表示为1000,23
或1.000,23
。
从示例中可以看出,逗号可以有两个不同的含义。
如果您想允许在表单字段中输入千位分隔符,请在settings.py
文件中设置USE_THOUSAND_SEPARATOR=True。如果在en-us
区域设置中,用户将能够输入数字1,000.23
或1000.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)。