代码之家  ›  专栏  ›  技术社区  ›  Vebjorn Ljosa

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

  •  17
  • Vebjorn Ljosa  · 技术社区  · 16 年前

    我正在写一个Django应用程序,在一个国家里使用逗号 decimal separator django.db.models.DecimalField ,我使用 model forms

    跟随 advice 属于 jweyrich ,我已经将我的应用程序从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

    我发现了一个 Django ticket Django changeset 从1.2版本之前开始。如果我理解正确的话,以前小部件是自动使用格式本地化的,但是在这个补丁之后,必须通过给出 本地化=真

    3 回复  |  直到 9 年前
        1
  •  21
  •   Vebjorn Ljosa    12 年前

    是的,本地化确实需要为每个字段显式地打开。对于模型表单(包括管理应用程序中使用的表单),一种方便的方法是对模型表单进行子类化,并为每个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)
    
        2
  •  9
  •   zvyn    9 年前

    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.

        3
  •  8
  •   Daniel Roseman    15 年前

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

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