如何在单个formView类Django中验证多重表单 [英] How to validate mulitple forms in a single formView class Django

查看:129
本文介绍了如何在单个formView类Django中验证多重表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 formView 类,您可以在下面看到: -



view.py

  class ThreadForm(FormView):
template_name ='thread.html'
form_class = ThreadModelForm
success_url ='/ success'

def form_valid(self,form):
#当有效的表单数据已被POST时,此方法被调用。
#它应该返回一个HttpResponse。
打印form.cleaned_data
返回超级(ThreadForm,self).form_valid(form)

def get_context_data(self,** kwargs):
context = ThreadForm,self).get_context_data(** kwargs)
上下文['second_form'] = MessageModelForm
返回上下文

thread.html

  {form.as_p} 
{second_form.as_p}
SUBMIT

在我的模板中,我有两个模型,但单提交按钮。问题是我没有从我的 second_form 获取任何数据,并且不能验证 second_form 。我从表单中收到数据,但不是从 second_form 中收到数据。任何人都可以告诉我如何验证 second_form 数据。谢谢



一种方法是使用 request.post ['data'] 但是有没有其他方法?

解决方案

我使用 FormView (或 CreateView UpdateView 等)
这就是我所做的:



pre $ class ThreadForm(FormView):
template_name ='thread.html'
form_class = ThreadModelForm
...

def get_second_form(self):
#构造第二个表单的逻辑到这里
#如果self.request.method =='POST',你需要传递self.request.POST
#表格。添加任何你需要创建窗体
如果self.request.method =='POST':
返回SecondForm(self.request.POST)
else:
返回SecondForm )

def form_valid(self,form):
self.second_form = self.get_second_form()
如果self.second_form.is_valid():
#全部好逻辑在这里,最简单的情况是
#返回super.form_valid
返回超级(ThreadForm,self).form_valid(form)
else:
#第一种形式是无效的
返回超级(ThreadForm,self).form_invalid(form)

#只有当您需要验证第二个表单时,第一个表单是
#无效
def form_invalid(self,form):
self.second_form = self.get_second_form()
self.second_form.is_valid()
返回超级(ThreadForm,self).form_invalid( form)

#Tr这里是
def get_context_data(self,** kwargs):
context = super(ThreadedForm,self).get_context_data(** kwargs)
上下文['second_form'] = getattr ,'second_form',self.get_second_form())
返回上下文


I have a formView class as you can see below:-

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 

In my template thread.html, I have two modelforms but single submit button. The problem is I am not getting any data from my second_form and not able validate second_form as well. I am receiving data from form but not from second_form. Could anyone tell me how to validate second_form data. Thank you

One method is to use request.post['data'] but is there any other method there?

解决方案

I do use FormView (or CreateView, UpdateView, etc.) This is what I do:

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类Django中验证多重表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆