Django создает пользовательское поле модели для валют

Вот мое пользовательское поле модели, которое я создал

class CurrencyAmountField(models.DecimalField):
    INTEGER_PLACES = 5
    DECIMAL_PLACES = 5

    DECIMAL_PLACES_FOR_USER = 2

    MAX_DIGITS = INTEGER_PLACES + DECIMAL_PLACES

    MAX_VALUE = Decimal('99999.99999')
    MIN_VALUE = Decimal('-99999.99999')

    def __init__(self, verbose_name=None, name=None, max_digits=MAX_DIGITS,
                 decimal_places=DECIMAL_PLACES, **kwargs):
        super().__init__(verbose_name=verbose_name, name=name, max_digits=max_digits,
                         decimal_places=decimal_places, **kwargs)

Как я могу показать числа в режиме разделения запятыми в админских формах Django? Должен ли я переопределить какой-то метод здесь на этом поле пользовательской модели или есть другой способ сделать это?

enter image description here

Должно быть:

enter image description here

Первый:

MAX_VALUE = Decimal('99999.99999')

90.000 < 333.222.111 Выдает ошибку валидации, если вы пишете 333222111. В вашем вопросе вы используете это число.

Секунда:

На изображении у вас есть input и textarea. Для получения textarea необходимо изменить виджет = TextInput в поле.

class CurrencyAmountField(models.DecimalField):
    widget = Textarea

Вы можете сделать это также в форме. Вы можете сделать это и в modelAdmin. И вам не нужен собственный класс Field.

Третья:

вы можете использовать MaxValueValidator, MinValueValidator вместо MAX_VALUE, после чего - вам не нужно создавать свой собственный класс поля.

myAmount = DecimalField(max_digits=10, decimal_places=5, validators=[MaxValueValidator(Decimal('99999.99999')), MinValueValidator(Decimal('-99999.99999'))])

Четыре:

проверьте свои настройки. подробнее здесь: https://docs.djangoproject.com/en/4.1/ref/settings/#std-setting-USE_THOUSAND_SEPARATOR

ИСПОЛЬЗОВАТЬ_ТЫСЯЧНЫЙ_РАЗДЕЛИТЕЛЬ, ИСПОЛЬЗОВАТЬ_L10N, ГРУППИРОВКА_ЧИСЕЛ, ТЫСЯЧНЫЙ_РАЗДЕЛИТЕЛЬ пожалуйста, напишите это в вашем вопросе.

Пять:

Для этого простого вопроса вам не нужно менять какой-либо шаблон.

Хотя мне еще не удалось добиться отображения запятой при вводе, мне удалось добиться отображения запятой при просмотре сохраненной модели

Вот что я пробовал в настоящее время

# forms.py
class ValuesForm(forms.ModelForm):
    class Meta:
        model = Values
        fields = ['value']

    value = forms.DecimalField(localize=True)


#settings.py
USE_THOUSAND_SEPARATOR = True

#admin.py
class ValuesAdmin(admin.ModelAdmin):
    form = ValuesForm

#models.py
class Values(models.Model):
    value = models.DecimalField(max_digits=10, decimal_places=2

Хотя документация предполагает, что это возможно сделать на вводе, это может потребовать пользовательского виджета, поэтому я изучу этот вопрос в ближайшее время.

В качестве рабочего решения я заменил запятую на _ при вводе, вручную.

например, 12_345_678, который при сохранении отображается как 12,345,678

Вернуться на верх