Уведомления

Группа в Telegram: @pythonsu

#1 Май 31, 2013 18:18:00

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Валидация формы

Есть форма

class SocWorkerForm(ModelForm):
    class Meta:
        model = SocWorker
        exclude = ('agency', 'atime')
    def __init__(self, *args, **kwargs):
        self.agency = kwargs.pop('agency')
        super(SocWorkerForm, self).__init__(*args, **kwargs)
        self.fields['department'].queryset = Department.objects.filter(agency=self.agency)
        self.fields['inn'].widget.attrs = {'maxlength' : '12', 'minlength' : '10'}
        self.fields['snils'].widget.attrs = {'maxlength' : '11'}


class SocWorker(SocWorker_detailed_inf):
    class Meta:
        verbose_name = 'Работник'
        verbose_name_plural = 'Работники'
    agency = models.ForeignKey(Agency) 
    department = models.ForeignKey(Department, verbose_name='Отделение', null=True, blank=True)
    surname = models.CharField('Фамилия', max_length=256)
# Абстрактный класс, использует доп. поля (с именами атрибутов этого класса) для SocWorker
class SocWorker_detailed_inf(models.Model):
    inn = models.IntegerField('ИНН', max_length=10, blank=True)
    snils = models.IntegerField('СНИЛС', max_length=11, blank=True)

Требуется проверить сколько символов было введено в поля inn, snils и если <10 символов - выдать ошибку. Подскажите, пожалуйста, как сделать это

Офлайн

#2 Май 31, 2013 23:23:37

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Валидация формы

к форме допишите методы

    
from django.utils.translation import ugettext_lazy as _   
def clean_inn(self):
    inn = self.cleaned_data.get['inn']
    if len(inn) < 10:
        raise forms.ValidationError(_("Wrong inn length"))
    return inn    
def clean_snils(self):
    snils = self.cleaned_data['snils']
    if len(snils) < 10:
        raise forms.ValidationError(_("Wrong snils length"))
    return snils
все написано

Отредактировано nnmware (Май 31, 2013 23:24:44)

Офлайн

#3 Июнь 1, 2013 00:36:52

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Валидация формы

Спасибо, nnmware, уже сам разобрался, но теперь есть другая проблема - не выводится сообщение ошибки…

В примере nnmware выше возникает ошибки в строке raise forms.ValidationError(_(“Wrong inn length”))
Пишет global name “_” is not defined

Вот мой код.

    def clean_inn(self):
        data = str(self.cleaned_data['inn'])
        if len(data)<10:
            raise forms.ValidationError(u"Длина ИНН должна быть больше")
        return data
        data = int(data)
        self._errors['inn'] = self.error_class([u"Длина ИНН должна быть больше"])
    def clean_snils(self):
        snilsd = str(self.cleaned_data['snils'])
        if len(snilsd)<11:
            raise forms.ValidationError(u"Длина СНИЛС должна быть больше")
        return snilsd
        snilsd = int(snilsd)
        self._errors['snils'] = self.error_class([u"Длина СНИЛС должна быть больше"])

Спасибо за внимание, как теперь бы отобразить ошибку…
вывожу в шаблоне как {{ form.snils.errors }}

Отредактировано easthy (Июнь 1, 2013 00:38:00)

Офлайн

#4 Июнь 1, 2013 01:37:51

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Валидация формы

Дык я и указал специально дополнительный импорт
from django.utils.translation import ugettext_lazy as _
чтобы не было global name “_” is not defined
это для перевода жиж.

У Вас строки после return- бессмысленны.
А вывод ошибки {{ form.snils.errors }} и {{ form.inn.errors }} так должно работать

Офлайн

#5 Июнь 1, 2013 10:25:40

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Валидация формы

nnmware
У Вас строки после return- бессмысленны.
А вывод ошибки {{ form.snils.errors }} и {{ form.inn.errors }} так должно работать
Сообщение ошибки не выводится…
Что со строчками после return как у меня, что без них

Отредактировано easthy (Июнь 1, 2013 10:26:02)

Офлайн

#6 Июнь 1, 2013 12:58:59

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Валидация формы

Что делает метод cleaned_data если после этого нельзя сохранить в базу пустое значение?
Т.е. убираю эту проверку - в базу сохраняется пустое значение, добавляю проверку - ошибка валидации формы

   def clean_snils(self):
        snils = str(self.cleaned_data['snils'])
        if  len(snils)>=1 and len(snils)<11:
            raise forms.ValidationError(u"Длина СНИЛС должна быть больше")
        return snils

Офлайн

#7 Июнь 1, 2013 15:15:53

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Валидация формы

Может после выполнения clean_inn поле становится обязательным для заполнения… как тогда указать , required=False по подобию
f

 = forms.CharField(required=False)

если форма создается так
class SocWorkerForm(ModelForm):
    class Meta:
        model = SocWorker

class SocWorker_detailed_inf(models.Model):
    inn = models.IntegerField('ИНН', max_length=10, blank=True, null=True)
class SocWorker(SocWorker_detailed_inf):
....

Офлайн

#8 Июнь 1, 2013 16:06:55

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Валидация формы

Решил это так

    def clean_inn(self):
        inn = self.cleaned_data['inn']
        if inn is not None:
            inn=str(inn)            
            if len(inn)>=1 and len(inn)<10:
                raise forms.ValidationError(_(u"Длина ИНН должна быть больше"))
                inn=int(inn)
        return inn

Теперь пустое значение сохраняется не вызывая validation error
Как бы теперь вывести сообщение об ошибке

пробовал в шаблоне писать
{{ form.inn.errors }} {{ socworkerform.form.non_field_errors }}

не выводится сообщение

Офлайн

#9 Июнь 1, 2013 17:03:48

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Валидация формы

пробовал

class SocWorkerForm(ModelForm):
    class Meta:
        model = SocWorker
    def __init__(self, *args, **kwargs):
        super(SocWorkerForm, self).__init__(*args, **kwargs)
        self.fields['inn'].error_messages = {'inn': 'Test'}


    def clean_inn(self):
        inn = self.cleaned_data['inn']
        if inn is not None:
            inn=str(inn)            
            if len(inn)>=1 and len(inn)<10:
                raise forms.ValidationError(_(u"Длина ИНН должна быть больше"))
                inn=int(inn)
        return inn



raise forms.ValidationError(_(u"Длина ИНН должна быть больше"))
менял на
raise forms.ValidationError('inn')

в шаблоне вывожу как
{{ form.inn.errors }}

не выводится сообщение об ошибке

Отредактировано easthy (Июнь 1, 2013 17:15:52)

Офлайн

#10 Июнь 1, 2013 17:31:58

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Валидация формы

Про return- Вы если не видите разницу почему там после return строк не должно быть- неудивительно почему у Вас не выводится {{ form.inn.errors }}
Что-то делаете не так, документация джанги не врет же.
Что- по коду не понять.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version