Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2013 17:38:10

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

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

после return теперь ничего нет… не знаю как вывести ошибку…

сейчас код формы таков

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'}
        self.fields['snils'].widget.attrs = {'maxlength' : '11'}
        self.fields['inn'].error_messages['inn'] = 'Test error mess'
    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('inn')
                inn=int(inn)
        return inn

Офлайн

#2 Июнь 1, 2013 17:42:06

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

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

А вьюха какая которая эту форму использует? Может в ней дело.
И вот это непонятно зачем

self.fields['inn'].error_messages['inn'] = 'Test error mess' 
по логике- если в clean поля есть forms.ValidationError- это сообщение и должно выдаваться в {{ form.поле.errors }} в шаблон.

Отредактировано nnmware (Июнь 1, 2013 17:42:33)

Офлайн

#3 Июнь 1, 2013 17:44:38

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

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

@login_required
def socworker_view(request, soc_id=0):
    agency = request.user.get_profile().agency
    socworker = get_object_or_404(SocWorker, pk=soc_id)
    alphabet = socworker.surname[:1]  # первая буква фамилии
   
    if socworker.agency != agency:
        raise Http404
    if request.method == 'POST':
        request.POST.__setitem__('alphabet', alphabet) # т.к. форма под это поле базы данных не выводится
        form = SocWorkerForm(request.POST, request.FILES, agency=agency, instance=socworker)
        if form.is_valid():
            socworker = form.save()
            action = 'success'
            LogRecord(user=request.user.get_profile(), object_url="socworker/%d" % (socworker.id)).save()
        else:
            action = 'errors'
    else:
        action = 'new'
    form = SocWorkerForm(agency=agency, instance=socworker)       
    return render_to_response('socworker.html', 
                                {'agency' : agency,
                                 'department' : socworker.department,
                                 'page'   : 'socworkers',
                                 'form'   : form,
                                 'action' : action,
                                 'soc_id' : soc_id,
                                 'firstname' : socworker.firstname,
								 'surname' : socworker.surname,
								 'fathername' : socworker.fathername,
                                 'alphabet' : alphabet
                                } ,
                                context_instance=RequestContext(request))

вьюха

по логике то оно должно, но не выводится, потому пробую все варианты подряд. Разбирался долго - ничего не выходит - теперь барахтаюсь как утопающий и пробую все подряд…

Офлайн

#4 Июнь 1, 2013 19:10:07

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

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

Ну скажем так- маловнятно как-то выглядит вьюха.
firstname - surname зачем в шаблон сувать?
Достаточно sockwoker один передать и в шаблоне в нужных местах брать {{ sockwoker.firstname }} и тп.
action не особо надо как раз. если в форме ошибки- см. доки, их тоже можно отловить в шаблоне.
С алфавитом какая то муть.
Я бы на Class-based View переделал все это, но у Вас подход явно не правильный.
Доки читайте лучше, серьезно. Слишком неправильно делаете.

Офлайн

#5 Июнь 1, 2013 19:45:09

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

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

Спасибо за замечания
Знаком с django и python вторую неделю, потому код корявый. View переделывать на класс-методы - переписать чужой код, который достался в наследство и учитывая текущие знания лучше предыдущее сделанное не трогать

Но всё же, как передать сообщение об ошибке..
Сейчас пришла лишь одна мысль - проверять POST-переменную… но это, понимаю, убого… оно конечно заработает, но как взять сообщение об ошибке после валидации формы… хех

Офлайн

#6 Июнь 1, 2013 20:18:44

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

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

action нужен для отображения информации пользователю

            {% if action == "success" %}
            <div class="alert alert-success">
                Данные успешно сохранены
            </div>
            {% elif action == "errors" %}
            <div class="alert alert-error">
                Пожалуйста, исправьте ошибки в заполнении 
            </div>
            {% endif %}

ошибки отлавливаю так

                    {% if form.firstname.errors %}py
                    <div class="control-group error">
                    {% else %}
                    <div class="control-group">
                    {% endif %}


вывод сообщения об ошибке реализовал, анализируя POST переменную… аж стыдно за такой код, но если стандартный метод не работае…

Офлайн

#7 Июнь 4, 2013 15:58:16

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

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

Решил вопрос.
МОжет кому пригодится: проблема связана с тем, что в во view файле в строчке

form = SocWorkerForm(agency=agency, instance=socworker)

не передавал request.POST, т.е. для отображения ошибок необходимо было написать так

form = SocWorkerForm(request.POST, agency=agency, instance=socworker)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version