Я делаю это с form_invalid
. Вот как я это делаю:
from django.views.generic import FormView
class ContextFormView(FormView):
def get(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
context = self.get_context_data(**kwargs)
context['form'] = form
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form, **kwargs)
def form_invalid(self, form, **kwargs):
context = self.get_context_data(**kwargs)
context['form'] = form
return self.render_to_response(context)
Вы можете сделать то же самое, но для form_valid. Обычно тело form_valid выглядит так:
def form_valid(self, form):
return HttpResponseRedirect(self.get_success_url())
Вам придется переопределить как post
, так и form_valid
, потому что post
вызывает form_valid
.
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form, **kwargs)
else:
return self.form_invalid(form, **kwargs)
def form_valid(self, form, **kwargs):
# take some other action here
return HttpResponseRedirect(self.get_success_url())
О, и просто для пояснения, причина этой проблемы в том, что метод get
класса ProcessFormView
не работает. Обычно это выглядит так:
def get(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
return self.render_to_response(self.get_context_data(form=form))
Он просто выбрасывает каргов (._.)