简体   繁体   中英

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. 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? 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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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