默认启用Django格式本地化
这段内容是关于Django 1.2中实现的一个叫做格式本地化的功能。
要使用这个功能,你需要在所有表单字段中添加一个localize=True
的参数。我想在我的应用中实现这个本地化功能,但问题是我使用Django提供的inlineformset_factory
方法动态创建表单,所以不能简单地在表单字段中添加一个新参数。
因此,我尝试在所有模型中默认启用这个功能,而不需要为每个字段添加新参数。我创建了一个BaseInlineFormSet的子类,并在里面硬编码了这个参数。
class MyBaseInlineFormSet(BaseInlineFormSet):
def __init__(self, *args, **kwargs):
super(MyBaseInlineFormSet, self).__init__(*args, **kwargs)
for form in self.forms:
for key, field in form.fields.iteritems():
if field.__class__ == forms.DecimalField:
form.fields[key].localize = True
这样做只解决了一半的问题。现在提交表单时,Django能够正确验证(它接受逗号而不仅仅是点),但字段的显示仍然不正确。
我想我可以用JavaScript来解决这个问题,但我更倾向于避免这样做。
有没有什么好的办法来解决这个问题呢?
2 个回答
0
我还没用过它——(还没选好一个用Django开发的项目)——但看起来这是一个关于子类化的情况。
与其让你的字段直接继承自forms.DecimalField,不如让它们变成:
class LocalizedDecimalField(forms.DecimalField):
localize = True
7
Django 1.2 现在已经有三年了。Django 1.6 提供了一种很好的方法来解决你的困惑:
根据文档:
默认情况下,ModelForm 中的字段不会自动进行本地化,也就是不会根据地区来调整数据格式。如果你想让字段支持本地化,可以在 Meta 类中使用 localized_fields 属性。
>>> from django.forms import ModelForm
>>> from myapp.models import Author
>>> class AuthorForm(ModelForm):
... class Meta:
... model = Author
... localized_fields = ('birth_date',)
如果将 localized_fields 设置为特殊值 __all__
,那么所有字段都会进行本地化处理。