Форум сайта python.su
Есть форма
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)
Офлайн
к форме допишите методы
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)
Офлайн
Спасибо, 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"Длина СНИЛС должна быть больше"])
Отредактировано easthy (Июнь 1, 2013 00:38:00)
Офлайн
Дык я и указал специально дополнительный импорт
from django.utils.translation import ugettext_lazy as _
чтобы не было global name “_” is not defined
это для перевода жиж.
У Вас строки после return- бессмысленны.
А вывод ошибки {{ form.snils.errors }} и {{ form.inn.errors }} так должно работать
Офлайн
nnmwareСообщение ошибки не выводится…
У Вас строки после return- бессмысленны.
А вывод ошибки {{ form.snils.errors }} и {{ form.inn.errors }} так должно работать
Отредактировано easthy (Июнь 1, 2013 10:26:02)
Офлайн
Что делает метод 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
Офлайн
Может после выполнения 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): ....
Офлайн
Решил это так
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
Офлайн
пробовал
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')
Отредактировано easthy (Июнь 1, 2013 17:15:52)
Офлайн
Про return- Вы если не видите разницу почему там после return строк не должно быть- неудивительно почему у Вас не выводится {{ form.inn.errors }}
Что-то делаете не так, документация джанги не врет же.
Что- по коду не понять.
Офлайн