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? Должен ли я переопределить какой-то метод здесь на этом поле пользовательской модели или есть другой способ сделать это?
Должно быть:
Первый:
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