БетаЛаборатория - внеочередной IT-блог

Записки обычного программиста

 

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 в которых нужен ввод чисел с плавающей точкой. А во-вторых, вывод значения поля будет по прежнему с точкой. На данный момент меня такое решение устраивает, однако я попробую придумать что-то более гибкое.

pyhoster, 14/03/2010 13:45

Комментарии

iLq(Гость)

Спасибо.
Придумали ли что-нибудь более гибкое?
Можно поподробнее на счет готового в отдельном бранче? Нет ли сейчас чего-нибудь готового в новых версиях?
С уважением, Илья

pyhoster

Илья, начиная версии 1.4 это включено в стандартную локализацию - https://docs.djangoproject.com/en/1.4/topics/i18n/formatting/#format-localization

  • Как пользователь
  • Без регистрации
  • OpenID
Вы должны зарегистрироваться или авторизоваться, чтобы оставлять комментарии.

Введите код указаный на картинке:  

OpenID is not supported at this moment =(

Авторизация

Логин:

Пароль:


Регистрация | Забыли пароль?


Последние записи


Promo

Follow pyhoster on Twitter Subscribe

Реклама

A Django project.