默认启用Django格式本地化

4 投票
2 回答
1858 浏览
提问于 2025-04-16 02:29

这段内容是关于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__,那么所有字段都会进行本地化处理。

撰写回答