簡體   English   中英

如何在通用 CreateView 的 post 方法中處理內聯表單集?

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

我有一個表單和內聯表單集,都在同一頁面上以更新廣告和圖片 model。 這是代碼:

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 ?

所以問題是,如何在 post 方法中獲取內聯表單集並驗證並保存它? 我應該返回什么?

我的意思是這是一種正確的方法,或者也許還有其他方法可以做到這一點。

這是我使用的一種方式。 如果您不理解以下代碼中的某些內容,請隨時提出任何問題。

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