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.