Создание форм Django использует запятую как десятичный разделитель
Я пишу приложение Django для использования в стране, где они используют запятую как десятичный разделитель. У меня есть модель, содержащая django.db.models.DecimalField
, и я использую модельных форм. Как я могу сделать полученную визуализацию поля формы с помощью запятой и принять запятую от пользователя?
Следуя советам 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',
)
Насколько я вижу, это все, что требует документация. Теперь он работает для форм, если я устанавливаю localization=True
в поле формы. Он не работает ни в формы модели, ни сайт администратора, Однако.
Я обнаружил Django ticket и полученный набор изменений Django до релиза 1.2. Если я правильно их понимаю, раньше это было так, что виджеты автоматически использовали локализацию формата, но после того, как локализация этого патча должна быть включена явно, указав параметр ключевого слова localization=True
в поле формы. Есть ли способ сделать админ-формы установленными localization=True
в своих полях?
Ответы
Ответ 1
Да, локализация должна быть включена явно для каждого поля. Для модельной формы (включая те, которые используются в админ-приложении) удобным способом сделать это является подкласс 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 и использовать его в приложении admin:
class FooForm(LocalizedModelForm):
class Meta:
model = Foo
django.admin.site.register(Foo, form=FooForm)
Ответ 2
Правильно, это выглядит как раздражающий полом, который я удивлен, никто не сообщил. Из-за упомянутого изменения локализация должна быть явно включена для каждого поля в вашем приложении администратора или модели. Лучший способ сделать это - определить пользовательский ModelForm для использования как в администраторе, так и в вашем приложении и установить словарь widgets
, чтобы включить локализацию в каждом соответствующем поле.
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'my_decimal_field': forms.TextInput(attrs={'localization': True}),
}
Ответ 3
В 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)
См. официальную документацию для более подробного объяснения.