我正在编写一个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
在他们的字段上设置管理表单?
是的,需要为每个字段明确启用本地化.对于模型表单(包括管理应用程序中使用的表单),一种方便的方法是对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)
在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)
有关更详细的说明,请参阅官方文档.
对,这看起来像一个恼人的破损,我很惊讶没有人报告.由于您提到的更改,必须为管理应用或模型表单中的每个字段明确启用本地化.最好的方法是定义一个自定义的ModelForm,以便在管理员和应用程序中使用,并设置widgets
字典以在每个相关字段上启用本地化.
class MyModelForm(forms.ModelForm): class Meta: model = MyModel widgets = { 'my_decimal_field': forms.TextInput(attrs={'localization': True}), }