2013-03-10 4 views
2

나는 거래를위한 modelform을 가지고있다. 해당 트랜잭션 모델에는 금액 (DecimaField) 필드가 있습니다. 을 입력하면 데이터를 저장할 수는 있지만 오류는 표시되지 않으며 새로 고침 만합니다. 나는 modelform에 현지화하려고하지만 여전히 나를 허용하지 않습니다.사용자가 쉼표를 입력하는 것을 허용하는 방법

양식에 쉼표 (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가 도움이 될 수 있습니까? –

+0

@EllochkaCannibal 나는 이미 그 효과를 시도했지만 아무런 효과가 없었다. 어쩌면 장고 1.4에 변경이 있습니다 – catherine

+0

전체보기 코드를 표시하십시오. 오류가 렌더링되지 않는다는 사실은보기에 문제가 있음을 나타냅니다. 오류 메시지는 잘못된 정밀도로 입력 된 숫자와 같은 쉼표가있는 오류 이외의 것을 나타낼 수 있습니다. –

답변

2

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) 
     #... 

(요청을 변경할 수 없습니다 .POST 사전 자체는 immutable입니다.)

+0

와우, 효과가 있습니다. 마지막 질문 하나, 이것이 안전합니까? – catherine

+0

새로운 보안 위험은 없습니다 (로컬 설정이있는 모델에서 입력을 처리 할 시간이 정말로없는 경우에만 수행하십시오). –

3

쉼표가 어떤 의미를 가져야하는지에 따라 다릅니다. 천 단위 구분 기호로 사용할지 또는 숫자의 로케일 기반 입력을 사용할지 선택합니다.

우리가 천 달러와 23 센트를 나타내는 십진수에 대해 이야기한다고 가정 해 봅시다.

en-us 로켈의 경우 으로 표시하거나 1000 단위 구분 기호를 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 로켈에서는 1000 단위 구분 기호에 점을 입력 할 수 있습니다.

기본 Django 로켈은 en-us입니다. 다른 로케일과 로케일에 따라 다른 숫자 형식의 항목도 지원하려면 MIDDLEWARE_CLASSESdjango.middleware.locale.LocaleMiddleware을 추가해야합니다. 이 미들웨어는 요청 헤더별로 HTTP Accept-Language 요청 헤더를보고 로캘 설정을 요청 단위로 설정하므로 사용자가 코드를 변경하지 않고도 자신의 로캘로 숫자를 입력 할 수 있습니다.

10 진수 필드에 대해 오류가 렌더링되지 않으면보기 코드에 문제가있을 가능성이 있습니다. 예를 들어, 양식을 만들 수 있지만 잘못된 코드 경로로 인해 is_valid()에 대한 호출이 이루어지지 않습니다. 그런 다음 결과 POSTed 양식은 첨부 된 오류 목록없이 양식을 렌더링합니다.

- 당신이 설명하는 상황이, 당신이보기의 시작 부분에 request.POST querydict를 복사 입력에서 잘못된 쉼표를 제거하고 생성자를 형성하기 위해 조정 된 querydict을 전달할 수 처리 할 수있는 신속하고 더러운 수정에 대한
+0

+1 설명. 나는 나중에 그것을 시도 할 것이고, 그것이 효과가 있다면 당신의 대답을 표시 할 것입니다. 어제, 난 단지 내 문제를 해결하기 위해 많은 코딩을 시도하지만 아무 것도 일어나지 않아 당신의 대답이 잘되기를 바랍니다 :) – catherine

+0

죄송합니다. 작동하지 않습니다. 허 .. 시스템이 DecimalField의 유효성을 검사 할 때 쉼표를 허용하지 않습니다. 패스. – catherine

+0

@ 캐서린 [USE_L10N = True] (https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n)이 있으십니까? 표시되는 양식 오류 란 무엇입니까? –

관련 문제