Django - проверка формы (почему я не могу вручную очистить поле формы Integer) - PullRequest
2 голосов
/ 22 июня 2011

Это должно быть довольно просто, но я не пойму это из документации Django.У меня есть поле модели IntegerField, из которого я создал поле ModelForm.Данное поле содержит значения $ (цена), и с точки зрения UX было бы предпочтительнее, если бы пользователь не получал сообщение об ошибке («введите целое число»), когда вводил 10 вместо 10 *.пробовал ручную очистку формы, но кажется, что метод clean_field запускается после других методов проверки.Мое чтение до сих пор, кажется, подтверждает это также.

    def clean_bill(self):
          bill = self.cleaned_data["bill"]
          if '$' in bill:
              bill=bill.replace('$','',1)   
          return bill

Есть ли способ обойти это, поддерживая IntegerField в форме модели?Должен ли я просто сделать его RegexField?

РЕДАКТИРОВАТЬ: я закончил с комбинацией выше и RegexField.Все еще любопытно, есть ли другой / лучший способ.

        bill= forms.RegexField(label=_("Bill"), max_length=10,required=True, regex=r'^\$?[\d]+$',
    error_messages = {'invalid': _("Please enter a whole number.")})

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Создайте IntegerField в модели и CharField в форме.

Для этого вы все равно можете использовать modelform, но вам придется:

  1. 'exclude'поле модели из формы,
  2. , напишите метод clean_bill в форме
  3. , установите значение поля модели равным анализируемому целому значению

попробуйте это и / или это

1 голос
/ 22 июня 2011

Да, вы правы.Согласно Django документам проверки формы и поля он даже не перейдет к вашему clean методу и уже повысит ValidationError на первом шаге (to_python метод).Я думаю, что на уровне формы вы ничего не можете сделать.Однако вы могли бы обработать данные POST в представлении перед передачей их в форму.Несколько простых примеров:

post_dict = request.POST.copy()   #makes a copy of request.POST so you can modify it
bill = post_dict['bill']
if '$' in bill:
    bill = bill.replace('$','',1)   
post_dict['bill'] = bill
# pass post_dict to your form instead of request.POST
...
...