Skip to content

Instantly share code, notes, and snippets.

@coffeewasmyidea
Created November 24, 2016 20:40
Show Gist options
  • Save coffeewasmyidea/b6779a64f349a107a2cb13c86b1ea1b3 to your computer and use it in GitHub Desktop.
Save coffeewasmyidea/b6779a64f349a107a2cb13c86b1ea1b3 to your computer and use it in GitHub Desktop.
CBV with Multiple forms. Based on UpdateView.
class MultipleFormsView(ItemUpdate):
model = MyModel
template_name = ''
success_url = reverse_lazy('')
form_class = Form1
second_form_class = Form2
third_form_class = Form3
def get_context_data(self, **kwargs):
context = super(MultipleFormsView, self).get_context_data(**kwargs)
if 'form' not in context:
context['form'] = self.form_class(
initial={
'some_field_1': self.get_object().some_field_1,
'some_field_2': self.get_object().some_field_2,
})
if 'form1' not in context:
context['form1'] = self.second_form_class(
initial={
'some_field_3': self.get_object().some_field_3,
'some_field_4': self.get_object().some_field_4,
})
if 'form2' not in context:
context['form2'] = self.third_form_class(
initial={
'some_image': self.get_object().some_image
})
return context
def form_invalid(self, **kwargs):
return self.render_to_response(self.get_context_data(**kwargs))
def get_object(self, queryset=None):
if queryset is None:
queryset = self.get_queryset()
pk = self.kwargs.get(self.pk_url_kwarg)
slug = self.kwargs.get(self.slug_url_kwarg)
if pk is not None:
queryset = queryset.filter(pk=pk)
if slug is not None and (pk is None or self.query_pk_and_slug):
slug_field = self.get_slug_field()
queryset = queryset.filter(**{slug_field: slug})
if pk is None and slug is None:
raise Http404
try:
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404()
return obj
def post(self, request, *args, **kwargs):
self.object = self.get_object()
if 'form' in request.POST:
form_class = self.get_form_class()
form_name = 'form'
elif 'form1' in request.POST:
form_class = self.second_form_class
form_name = 'form1'
else:
form_class = self.third_form_class
form_name = 'form2'
form = self.get_form(form_class)
if form.is_valid():
cd = form.cleaned_data
if 'form' in request.POST:
form.instance.some_field = cd.get('some_field', None)
form.instance.metadata['some_meta_field'] = cd.get('some_meta_field', None)
form.instance.metadata['some_meta_field'] = cd.get('some_meta_field', None)
result = super().form_valid(form)
if form.changed_data:
self.object.reindex()
if 'some_image_1' in form.changed_data:
self.object.upload_images('some_image_1')
if 'some_image_2' in form.changed_data:
self.object.upload_images('some_image_2')
return result
else:
return self.form_invalid(**{form_name: form})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment