Como gerar um erro dentro do método form_valid de um CreateView

Em um projeto Django, tenho uma visão (nuvem), tipo: CreateView. Esta visão tem um inlineformset_factory. Funciona. Mas, se eu enviar o formulário com um erro (veja “messages.error” abaixo), a página é redirecionada para project.get_absolute_url (). O problema é: o conteúdo do formulário volta vazio. Eu sei que é porque o HttpResponseRedirect.

Como posso mudar isso sem quebrar o formulário?

views.py

class cloud(CreateView): template_name = 'base/cloud.html' form_class = UserForm def get_context_data(self, **kwargs): context = super(cloud, self).get_context_data(**kwargs) project = get_object_or_404(Project, slug=self.kwargs['slug']) context['project'] = project if self.request.POST: context['formset'] = IdeaFormset(self.request.POST or None) else: context['formset'] = IdeaFormset() return context def form_valid(self, form, **kwargs): project = get_object_or_404(Project, slug=self.kwargs['slug']) context = self.get_context_data() formset = context['formset'] if formset.is_valid(): self.object = form.save() formset.instance = self.object #IdeaFormFormSet nouns = project.nouns().values_list('content', flat=True) verbs = project.verbs().values_list('content', flat=True) error = False for form in formset.forms: #For each Idea form.instance.project = project if form.instance.sentence: sentence = form.instance.sentence validate_noun = [word for word in sentence.lower().split() if word in nouns] validate_verbs = [word for word in sentence.lower().split() if word in verbs] if (len(validate_noun) < 1): error = True messages.error(self.request, u'No noun was inserted into the sentence.', 'danger') if (len(validate_verbs) < 1): error = True messages.error(self.request, u'No verb was inserted into the sentence.', 'danger') if not error: formset.save() messages.success(self.request, u'Success!') return HttpResponseRedirect( project.get_absolute_url() ) else: return self.render_to_response(self.get_context_data(form=form)) 

cloud.html

   {% csrf_token %} Ideas 
{% for idea_form in formset %} {# Include the hidden fields #} {% for hidden in idea_form.hidden_fields %} {{ hidden }} {% endfor %}
{% for field in idea_form.visible_fields %}
{{ field.errors }} {{ field.label_tag }} {{ field }} {{ field.help_text }}
{% endfor %}
{% endfor %}
User {% for field in form %}
{{ field.label_tag }} {{ field }} {% if field.help_text %}

{{ field.help_text }}

{% endif %}
{% for error in field.errors %}{{ error }}{% endfor %}
{% endfor %} {{ formset.management_form }}

Como regra geral, a validação do modelo deve entrar nos validadores de campos do modelo ou no método clean do modelo. A validação de formulário deve entrar nos methods clean ou clean_ .

Se você precisa validar as coisas no form_valid sua view, você pode usar form.add_error e, em vez de redirect (ou retornar super(cloud, self).form_valid(form) , que redireciona de qualquer maneira), você pode retornar super(cloud, self).form_invalid(form) .

Verifique: https://docs.djangoproject.com/en/1.9/ref/forms/api/#django.forms.Form.add_error