使Django表单使用逗号作为小数分隔符

时间:2010-07-08 11:36:15

标签: django

我正在编写一个Django应用程序,用于他们使用逗号decimal separator的国家/地区。我有一个包含django.db.models.DecimalField的模型,我使用model forms。如何使用逗号生成结果表单字段并从用户接受逗号?

advicejweyrich之后,我已将我的应用程序从Django 1.1升级到Django 1.2并编辑了我的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.2发布之前发现了Django ticket和结果Django changeset。如果我正确理解它们,过去的情况是窗口小部件会自动使用格式本地化,但在此补丁之后,必须通过将localization=True关键字参数提供给表单字段来明确启用本地化。有没有办法让管理表单在其字段中设置localization=True

3 个答案:

答案 0 :(得分:21)

是的,确实需要为每个字段明确启用本地化。对于模型表单(包括管理应用程序中使用的表单),一种方便的方法是对ModelForm进行子类化并为每个DecimalField打开本地化:

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类并在管理应用程序中使用它:

class FooForm(LocalizedModelForm):

    class Meta:
        model = Foo


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

答案 1 :(得分:8)

是的,这看起来像一个恼人的破损,我很惊讶没有人报告过。由于您提到的更改,必须为管理应用或模型表单中的每个字段明确启用本地化。最好的方法是定义一个自定义的ModelForm,以便在管理员和应用程序中使用,并设置widgets字典以在每个相关字段上启用本地化。

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

答案 2 :(得分:8)

在django> = 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.