当前位置:  开发笔记 > 后端 > 正文

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

如何解决《使Django表单使用逗号作为小数分隔符》经验,为你挑选了3个好方法。

我正在编写一个Django应用程序,用于他们使用逗号作为小数分隔符的国家/地区.我有一个包含a的模型,django.db.models.DecimalField我使用模型表单.如何使用逗号生成结果表单字段并从用户接受逗号?

继咨询的jweyrich,我从Django的1.1我的应用程序升级到1.2的Django和编辑我的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',
)

据我所知,这就是文档所要求的.如果我localization=True在表单字段上设置它现在适用于表单.但是,它既不适用于模型,也不适用于管理站点.

我在1.2发布之前发现了一张Django票和一个Django变更集.如果我正确理解它们,过去的情况是小部件自动使用格式本地化,但在此之后,必须通过将localization=True关键字参数提供给表单字段来明确启用此修补程序本地化.有没有办法localization=True在他们的字段上设置管理表单?



1> Vebjorn Ljos..:

是的,需要为每个字段明确启用本地化.对于模型表单(包括管理应用程序中使用的表单),一种方便的方法是对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)


我宁愿把它变成一个mixin:`LocalizationMixin(object):...`和`FooForm(LocalizationMixin,forms.ModelForm)`,所以你可以继续使用例如`FooForm(LocalizationMixin,floppyforms.ModelForm)`

2> zvyn..:

在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)

有关更详细的说明,请参阅官方文档.



3> Daniel Rosem..:

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

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


这只在HTML中设置了一个属性,但是你把我放在了正确的轨道上(一个自定义的ModelForm原来就是这样),所以你得到了赏金.谢谢!我将把工作解决方案作为一个单独的答案发布.
推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有