FloatField с запятой в Django Forms - Паллиатив
Давно собирался сделать возможность вводить Float разделенные не точкой, а запятой, да никак руки не доходили. Но, сегодня все-таки пришлось сделать, поскольку для заказчика это оказалось критично. В принципе, данная задача решена в отдельном бранче Django, однако я предпочел сделать более простое, но менее полное и гибкое решение - создал специальный FormField. Все что он делает - это заменяет в полученных от пользователя данных запятую на точку, после чего передает управления оригинальному FloatField.
from django import forms
class FloatFieldWithComma(forms.FloatField):
def clean(self, value):
# Проверяем задано ли вообще значение
if value:
# Если да - заменяем запятую на точку
value = value.replace(",", ".")
return super(FloatFieldWithComma, self).clean(value)
Соответственно, если вы используете ModelForm, вам надо будет переопределить поля с плавающей точкой
# Модель
class MyModel(models.Model):
name = models.CharField(max_length=150)
price = models.FloatField()
# Форма для модели. В таком виде форма будет требовать
# чтобы разделитель обязательно был точкой.
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
# А с переопределенным полем price валидными будут и
# точка и запятая
class MyModelForm(forms.ModelForm):
price = FloatFieldWithComma()
class Meta:
model = MyModel
Недостатки этого метода в том, что он, во-первых, не прозрачен для django-admin - чтобы все работало, потребуется переопределять формы всех AdminModel в которых нужен ввод чисел с плавающей точкой. А во-вторых, вывод значения поля будет по прежнему с точкой. На данный момент меня такое решение устраивает, однако я попробую придумать что-то более гибкое.
| Категории: Программирование | Тэги: Django |


