Подтвердить что ты не робот

Создание форм 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 в своих полях?

4b9b3361

Ответ 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}),
        }