2015-11-08 3 views
0

Каков правильный способ поднять ValidationError в FormView и передать его в шаблон с перезагруженной формой? В настоящее время у меня есть это:ValidationError в FormView Django

class ProfileUpdateView(FormView): 
    template_name = 'profile_update.html' 
    form_class = UserDetailForm 
    success_url = '/profile/' 

    def form_valid(self, form): 
     userdetail = form.save(commit = False) 
     try: 
      already_exist_info = UserDetail.objects.get(document_type=userdetail.document_type, 
       series=userdetail.series, number=userdetail.number) 
      raise forms.ValidationError("Document already exists in DB") 
     except UserDetail.DoesNotExist: 
      [... some stuff here ...] 
      userdetail.save() 
     return super(ProfileUpdateView, self).form_valid(form) 

Он работает, и я получаю страницу ошибки, но я бы предпочел, чтобы показать ошибку в шаблоне Reloaded формы. Кроме того, есть ли встроенный способ получить ValidationError в FormView? Я имею в виду, без импорта forms от django.

Thanx.

EDIT

Ну, я решил сделать все выходку другим способом - с помощью clear() метода. Так что теперь у меня есть это:

views.py

class ProfileUpdateView(FormView): 
    template_name = 'profile_update.html' 
    form_class = UserDetailForm 
    success_url = '/profile/' 

    def form_valid(self, form): 
     userdetail = form.save(commit = False) 
     #[... some stuff ...] 
     userdetail.save() 
     return super(ProfileUpdateView, self).form_valid(form) 

forms.py

class UserDetailForm(forms.ModelForm): 
    class Meta: 
     model = UserDetail 
     exclude = ('user',) 

    def clean(self): 
      cleaned_data = super(UserDetailForm, self).clean() 
      document_type = cleaned_data.get("document_type") 
      series = cleaned_data.get("series") 
      number = cleaned_data.get("number") 
      try: 
       already_exist_info = UserDetail.objects.get(document_type=document_type, 
        series=int(series), number=number) 
       raise forms.ValidationError("Document already exists in DB") 
      except: 
       pass 
      return cleaned_data 

Все вроде бы нормально в соответствии с docs, однако на этот раз форма просто сохраняет без ошибок.

+0

Вы пытались 'form.add_error ('field', 'message message')'? –

+0

Yeap, это не работает, так как я думаю, что моя ошибка не относится к определенному полю ... – chem1st

+0

Хорошо, попробуйте избавиться от form.save. Не можете ли вы просто получить доступ к данным с помощью form.cleaned_data? –

ответ

1

Подъем ValidationError в форме clean формы - это правильный подход.

Ваша проблема в том, что вы ловите все исключений, в том числе ValidationError. Если вы измените свой код, чтобы поймать более конкретное исключение, тогда он должен работать.

try: 
    already_exist_info = UserDetail.objects.get(
     document_type=document_type, 
     series=int(series), 
     number=number, 
    ) 
    raise forms.ValidationError("Document already exists in DB") 
except UserDetail.DoesNotExist: 
    pass 
return cleaned_data 
+0

Да, вы абсолютно правы. Спасибо. – chem1st

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