如何在单个formView类Django中验证多个表单
我有一个如何在单个formView类Django中验证多个表单,django,django-models,django-templates,django-views,django-class-based-views,Django,Django Models,Django Templates,Django Views,Django Class Based Views,我有一个formView类,如下所示: view.py class ThreadForm(FormView): template_name = 'thread.html' form_class = ThreadModelForm success_url = '/success' def form_valid(self, form): # This method is called when valid fo
formView
类,如下所示:
view.py
class ThreadForm(FormView):
template_name = 'thread.html'
form_class = ThreadModelForm
success_url = '/success'
def form_valid(self, form):
# This method is called when valid form data has been POSTed.
# It should return an HttpResponse.
print form.cleaned_data
return super(ThreadForm, self).form_valid(form)
def get_context_data(self, **kwargs):
context = super(ThreadForm, self).get_context_data(**kwargs)
context['second_form'] = MessageModelForm
return context
thread.html
{form.as_p}
{second_form.as_p}
SUBMIT
在我的模板thread.html
中,我有两个模型表单,但只有一个提交按钮。问题是我没有从我的second\u表单
获取任何数据,也无法验证second\u表单
。我正在从表单
接收数据,但不是从第二表单
接收数据。谁能告诉我如何验证second\u form
数据。多谢各位
一种方法是使用
request.post['data']
,但是还有其他方法吗?我确实使用FormView
(或者CreateView
,UpdateView
,等等)
我就是这么做的:
class ThreadForm(FormView):
template_name = 'thread.html'
form_class = ThreadModelForm
...
def get_second_form(self):
# logic to construct second form goes here
# if self.request.method == 'POST' you need to pass self.request.POST
# to the form. Add whatever you need to create the form
if self.request.method == 'POST':
return SecondForm(self.request.POST)
else:
return SecondForm()
def form_valid(self, form):
self.second_form = self.get_second_form()
if self.second_form.is_valid():
# All good logic goes here, which in the simplest case is
# returning super.form_valid
return super(ThreadForm, self).form_valid(form)
else:
# Otherwise treat as if the first form was invalid
return super(ThreadForm, self).form_invalid(form)
# Do this only if you need to validate second form when first form is
# invalid
def form_invalid(self, form):
self.second_form = self.get_second_form()
self.second_form.is_valid()
return super(ThreadForm, self).form_invalid(form)
# Trick is here
def get_context_data(self, **kwargs):
context = super(ThreadedForm, self).get_context_data(**kwargs)
context['second_form'] = getattr(self, 'second_form', self.get_second_form())
return context
我确实使用了
FormView
(或者CreateView
,UpdateView
,等等)
我就是这么做的:
class ThreadForm(FormView):
template_name = 'thread.html'
form_class = ThreadModelForm
...
def get_second_form(self):
# logic to construct second form goes here
# if self.request.method == 'POST' you need to pass self.request.POST
# to the form. Add whatever you need to create the form
if self.request.method == 'POST':
return SecondForm(self.request.POST)
else:
return SecondForm()
def form_valid(self, form):
self.second_form = self.get_second_form()
if self.second_form.is_valid():
# All good logic goes here, which in the simplest case is
# returning super.form_valid
return super(ThreadForm, self).form_valid(form)
else:
# Otherwise treat as if the first form was invalid
return super(ThreadForm, self).form_invalid(form)
# Do this only if you need to validate second form when first form is
# invalid
def form_invalid(self, form):
self.second_form = self.get_second_form()
self.second_form.is_valid()
return super(ThreadForm, self).form_invalid(form)
# Trick is here
def get_context_data(self, **kwargs):
context = super(ThreadedForm, self).get_context_data(**kwargs)
context['second_form'] = getattr(self, 'second_form', self.get_second_form())
return context
在这种情况下,最好使用模板视图。FormView被设计为只处理一个表单,你能给我一个templateview处理多个表单的例子吗?看看这里,在这种情况下,使用模板视图更好。FormView被设计为只处理一个表单。你能给我一个templateview处理多个表单的例子吗?看看这里,我通过从
请求中提取数据来解决这个问题。POST
但是你的答案要好得多。我会试试这个,然后再给你回复。我通过从请求中提取数据解决了这个问题。POST
但是你的答案要好得多。我会试试这个,然后再打给你。