Заставить формы Django использовать запятую в качестве десятичного разделителя - PullRequest
17 голосов
/ 08 июля 2010

Я пишу приложение 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 и полученный набор изменений Django по сравнению с выпуском 1.2. Если я правильно их понимаю, раньше было так, что виджеты использовали локализацию формата автоматически, но после этого патча локализацию нужно было явно включить, указав параметр ключевого слова localization=True в поле формы. Есть ли способ заставить административные формы устанавливать localization=True на своих полях?

Ответы [ 3 ]

21 голосов
/ 07 августа 2010

Да, локализация должна быть включена явно для каждого поля. Для формы модели (включая те, которые используются в приложении администратора), удобный способ сделать это - создать подкласс 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)
8 голосов
/ 11 апреля 2014

В 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)

Более подробное объяснение см. В официальной документации.

8 голосов
/ 02 августа 2010

Да, это похоже на досадную поломку, о которой я удивлен, что никто не сообщил. Из-за упомянутых вами изменений необходимо явно включить локализацию для каждого поля в приложении администратора или в форме модели. Лучший способ сделать это - определить пользовательскую ModelForm для использования как в админке, так и в приложении, и установить словарь widgets, чтобы включить локализацию для каждого соответствующего поля.

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'my_decimal_field': forms.TextInput(attrs={'localization': True}),
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...