2015-01-27 5 views
0

У меня есть модель; с полем cost. Я использую jquery number в этом поле, которое добавляет запятые, когда значение превышает 999. , например.Ошибка проверки формы модели Django для FloatField

Changes 1234 to 1,234 

Когда пользователь отправляет форму; данные не проверяются. Я пытаюсь поймать метод Clean, но это значение не существует в self.cleaned_data. Я также попытался извлечь это значение из self.data и преобразовать его в 1234 float и добавить в self.cleaned_data и вернуться. но это тоже не сработало.

Пожалуйста, позвольте мне написать.

Cost: Enter a number. 

Что мне не хватает?

ответ

1

https://docs.djangoproject.com/en/1.7/topics/i18n/formatting/

Сначала установите правильную локаль: settings.USE_I18N, settings.USE_L10N, settings.LANGUAGE_CODE, настройку. USE_THOUSAND_SEPARATOR

Во-вторых, установить виджет для локализации:

class MyForm(forms.ModelForm): 
     ... 
     def __init__(self, *args, **kwargs): 
      super(MyForm, self).__init__(*args, **kwargs) 
      self.fields['cost'].localize = True 
      self.fields['cost'].widget.is_localized = True 

, если вы используете forms.Form вместо ModelForm, то вам нужно только передать localize=True аргумент вашего определения поля

Edit: в то время как FormField(localize=True) и поэтому form.fileds['fieldname'].localize = True документирована, widget.is_localized не документирована и я принял это прямо from django code. Таким образом, потенциально поведение может Ставить в следующих версиях Джанго и так предпочитаемой образом использует FormField(localize=True)

0

Python не может преобразовать строку «1,234» в float.

>>> float("1,234") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for float(): 1,234 
>>> 

Вы можете дезинфицировать эти данные в __init__ методы формы в:

class MyForm(forms.Form): 
    def __init__(self, data=None, *args, **kwargs) 
     if data and 'cost' in data: 
      data['cost'] = data['cost'].replace(',', '') 
     super(MyForm, self).__init__(data, *args, **kwargs) 
+0

я могу его контролировать в чистом методе или есть ли другой способ? должен быть способ справиться с этим. Не уверен, что – Clayton

+0

В чистом я чищу его отлично; и присвоение ti «стоимости». но это тоже не работает. – Clayton

+0

Если вы выполняете проверку в методе 'clean()', тогда вы должны вручную очистить ошибку для поля 'cost', которое задано в вызове' super (MyForm, self) .clean() '. – catavaran

0

Вы можете просто переопределить поле по умолчанию, как это:

class MyForm(forms.ModelForm): 
    cost = forms.CharField() 

    def clean_cost(self): 
     data = self.cleaned_data['cost'] 
     return float(data.replace(',', '')) 

    class Meta: 
     model = MyModel 
     field = {'cost', ...} 

Подробная документация здесь: https://docs.djangoproject.com/en/1.7/topics/forms/modelforms/#overriding-the-default-fields

+0

Я пробовал это; но я не могу получить значение в clean_cost. – Clayton

+0

Я также попробовал 'data ['cost'] = float (self.data ['cost'])' фиктивный номер, но он тоже не работал. не уверен, почему – Clayton

Смежные вопросы