【问题标题】:How to validate mulitple forms in a single formView class Django如何在单个表单中验证多个表单查看类 Django
【发布时间】:2016-03-19 00:16:49
【问题描述】:

我有一个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_form 获得任何数据,也无法验证second_form。我从form 接收数据,但不是从second_form 接收数据。谁能告诉我如何验证second_form 数据。谢谢

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

【问题讨论】:

标签: django django-models django-templates django-views django-class-based-views


【解决方案1】:

我确实使用FormView(或CreateViewUpdateView等) 我就是这样做的:

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

【讨论】:

  • 我通过从request.POST 提取数据解决了这个问题,但您的回答要好得多。我会试试这个,然后回复你。
猜你喜欢
  • 2014-12-27
  • 2013-11-15
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
相关资源
最近更新 更多