我用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())
噢,我只想澄清,這個問題存在的原因是,ProcessFormView
類的get
方法被打破。它通常是這樣的:
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))
它只是拋出kwargs遠(._.)
感謝您的解決方案。兩年後,Django仍然沒有提供更新form_valid或form_invalid中的上下文的方法。 – pymarco
而在Django 1.7中:( – vinyll
Do Django 1.8提供了一種更新form_valid中的上下文的方法? –