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