简体   繁体   English

如何在通用 CreateView 的 post 方法中处理内联表单集?

[英]How to handle inline formset in post method of generic CreateView?

I have a form and inline formset, both on the same page to update Ad and Picture model.我有一个表单和内联表单集,都在同一页面上以更新广告和图片 model。 Here is the code:这是代码:

class AdCreateView(CreateView):
form_class = AdForm
template_name = 'main/ad_create.html'
success_url = '/ads'

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['picture_form'] = ImageFormset()
    return context

def post(self, request, *args, **kwargs):
    form = ????
    picture_form = ???

    if form.is_valid() and picture_form.is_valid():            
          **somehow save data from both forms to DB.**
          ???
    return ?

So the question is, how can I take the inline formset in post method and validate and save it?所以问题是,如何在 post 方法中获取内联表单集并验证并保存它? And what should I return?我应该返回什么?

I mean is this a proper way of doing it or maybe there are other ways to do it.我的意思是这是一种正确的方法,或者也许还有其他方法可以做到这一点。

Here's a way that i use.这是我使用的一种方式。 feel free to ask anything if you didn't understand something in below code.如果您不理解以下代码中的某些内容,请随时提出任何问题。

class LeadCreate(CreateView):
    model = Leads
    form_class = LeadsForm
    template_name = 'Lead/create.html'
    success_url = reverse_lazy('leadlist')
  
    def get_context_data(self, **kwargs):
        data = super(LeadCreate, self).get_context_data(**kwargs)
        if self.request.POST:
            data['leadqualifications']  = LeadQualificationFormSet(self.request.POST)
            data['leademployments']     = LeadEmploymentFormSet(self.request.POST)
            data['leadreferences']      = LeadReferenceFormSet(self.request.POST)
            data['leadkins']            = LeadKinFormSet(self.request.POST)
        else:
            data['leadqualifications']  = LeadQualificationFormSet()
            data['leademployments']     = LeadEmploymentFormSet()
            data['leadreferences']      = LeadReferenceFormSet()
            data['leadkins']            = LeadKinFormSet()
        return data
    def form_valid(self, form):
        user = self.request.user
        form.instance.added_by = user
        context = self.get_context_data()
        leadqualificationsforms = context['leadqualifications']
        leademploymentsforms    = context['leademployments']
        leadreferencesforms     = context['leadreferences']
        leadkinsforms           = context['leadkins']
        with transaction.atomic():
            form.instance.Lead = self.request.user
            self.object = form.save()
            if leadqualificationsforms.is_valid():
                leadqualificationsforms.instance = self.object
                leadqualificationsforms.save()
            else:
                print('qulification form is invalid')
                self.object.delete()
                return super(LeadCreate, self).form_invalid(form)  
            
            if leademploymentsforms.is_valid():
                    leademploymentsforms.instance = self.object
                    leademploymentsforms.save()
            else:
                print('employment form is invalid')
                self.object.delete()
                return super(LeadCreate, self).form_invalid(form)  

            if leadreferencesforms.is_valid():
                leadreferencesforms.instance = self.object
                leadreferencesforms.save()
            else:
                print('referencesforms form is invalid')
                self.object.delete()
                return super(LeadCreate, self).form_invalid(form)  
            if leadkinsforms.is_valid():
                leadkinsforms.instance = self.object
                leadkinsforms.save()
            else:
                print('Kin form is invalid')
                self.object.delete()
                return super(LeadCreate, self).form_invalid(form)
        usergroup=self.request.user.get_user_group()
        if usergroup.name == "agent":
            print('usergroup agent',usergroup)
            form.instance.Agent=self.request.user
            form.instance.Status=Student_status[-1][0]
        elif usergroup.name == "staff":
            form.instance.Responsible=self.request.user
        form.save()
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self,form):
        return super(LeadCreate, self).form_invalid(form)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM