2010-07-08 5 views
17

나는 쉼표를 decimal separator으로 사용하는 국가에서 사용할 장고 앱을 작성하고 있습니다. django.db.models.DecimalField이 포함 된 모델이 있는데 model forms을 사용합니다. 결과 폼 필드를 쉼표로 렌더링하고 사용자가 쉼표를 사용하도록하려면 어떻게합니까?Django 양식에서 쉼표를 소수 구분 기호로 사용합니다.

advicejweyrich의 다음, 나는 1.2 장고에 장고 1.1에서 내 응용 프로그램을 업그레이드하고 다음 포함하도록 내 settings.py을 편집 한 : 최대한 멀리 볼 수

LANGUAGE_CODE = 'nb' 
LANGUAGES = (
    ('nb', 'Norwegian'), 
) 
USE_I18N = True 
USE_L10N = True 
DECIMAL_SEPARATOR = ',' 
THOUSAND_SEPARATOR = ' ' 
MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
) 

,이 모든 the documentation 전화입니다 에 대한. 양식 필드에 localization=True을 설정하면 양식에 대해 작동합니다. 그러나 model forms이나 the admin site에서도 작동하지 않습니다.

1.27 릴리스 전의 결과는 Django ticket이고 그 결과는 Django changeset입니다. 필자가 올바르게 이해했다면, 위젯이 자동으로 형식 현지화를 사용했지만, 양식 필드에 localization=True 키워드 매개 변수를 지정하여이 패치 현지화를 명시 적으로 켜야했습니다. 관리자 양식을 해당 필드에 localization=True으로 설정하는 방법이 있습니까?

답변

21

예, 현지화는 모든 입력란에서 명시 적으로 사용 설정해야합니다.

import django 

class LocalizedModelForm(django.forms.ModelForm): 
    def __new__(cls, *args, **kwargs): 
     new_class = super(LocalizedModelForm, cls).__new__(cls, *args, **kwargs) 
     for field in new_class.base_fields.values(): 
      if isinstance(field, django.forms.DecimalField): 
       field.localize = True 
       field.widget.is_localized = True 
     return new_class 

는 그런 다음 사용자 정의 ModelForm 클래스 및 사용을 정의 할 수 있습니다 (관리자 응용 프로그램에서 사용하는 것을 포함) 모델 형태의 경우,이 작업을 수행 할 수있는 편리한 방법은 ModelForm 하위 클래스 및 각 DecimalField에 대한 현지화에 설정하는 것입니다 그것을 관리 응용 프로그램에서 : 장고

class FooForm(LocalizedModelForm): 

    class Meta: 
     model = Foo 


django.admin.site.register(Foo, form=FooForm) 
+0

훌륭하고 우아한 솔루션. – scum

+4

나는 이것을 mixin :'LocalizationMixin (object) : ...'와'FooForm (LocalizationMixin, forms.ModelForm)'으로 만들고 싶다. 'FooForm (LocalizationMixin, floppyforms.ModelForm)' – Webthusiast

+0

Models에서 직접 현지화를 사용하려면 어떻게해야합니까? ModelForms 아닙니다. 사용 사례 : 데이터를 게시하는 AJAX HTTP 요청에 응답하여 Decimal 필드가있는 모델에 해당 데이터 (천 단위 구분 기호로 쉼표가있는 숫자 포함)를 저장하려고합니다. 그것을위한 해결책을 찾을 수 없습니다. – jorgeas80

8

맞아요, 이건 정말 짜증나는 파손처럼 보입니다. 아무도 놀랍지 않습니다. 변경 사항 때문에 관리 앱 또는 모델 양식의 모든 입력란에 대해 현지화가 명시 적으로 설정되어야합니다. 이 작업을 수행하는 가장 좋은 방법은 관리자와 앱 모두에서 사용할 수있는 사용자 정의 ModelForm을 정의하고 widgets 사전을 설정하여 각 관련 필드에서 현지화를 사용하는 것입니다.

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     widgets = { 
      'my_decimal_field': forms.TextInput(attrs={'localization': True}), 
     } 
+3

HTML에서 속성 만 설정하지만 올바른 트랙 (사용자 정의 ModelForm이 이동 방법임이 밝혀졌습니다)에 놓기 때문에 현상금을 얻을 수 있습니다. 감사! 나는 작업 해결책을 별도의 답변으로 게시 할 것이다. –

7

> = 1.6이에 대한 간단한 해결책이있다 :

from django.forms import ModelForm 

class YourModelForm(ModelForm): 
    class Meta: 
     model = YourModel 
     localized_fields = '__all__' 

django.admin.site.register(YourModel, form=YourModelForm) 

See the official documentation for a more verbose explanation.

+1

forms.Form의 경우 'forms.DecimalField (label ='Foo ', localize = True)'가 작동합니다. – chhantyal

+0

주변에 괄호 '__all__'이 (가) – Chris

+0

변경됨, 감사합니다. @Chris – zvyn

관련 문제