Source code for cdh.core.views.base
from django.views.generic import RedirectView, View
from django.http import HttpResponseRedirect
from django.core.exceptions import ImproperlyConfigured
from django.shortcuts import render
from django.forms import modelformset_factory
[docs]class RedirectActionView(RedirectView):
"""This base view extends generic.RedirectView by adding a new method
that is called before getting the redirect url.
To be used for redirectViews that handle an action during it's request,
as an alternative to doing that stuff in get_redirect_url. (It's cleaner)
"""
[docs] def action(self, request):
"""
Override this method to perform any action you want to do in this
view
"""
[docs] def get(self, request, *args, **kwargs):
self.action(request)
return super(RedirectActionView, self).get(request, *args, **kwargs)
[docs]class FormSetUpdateView(View):
""" Generic update view that uses a formset. This allows you to edit
multiple forms of the same type on the same page.
Source: ETCL-portal https://github.com/UiL-OTS-labs/etcl (written by Ty
Mees)
"""
form = None
_formset = None
queryset = None
succes_url = None
extra = 0
[docs] def get(self, request, *args, **kwargs):
self._on_request()
return render(request, self.template_name, self.get_context_data())
[docs] def post(self, request, *args, **kwargs):
self._on_request()
formset = self._formset(
request.POST,
request.FILES,
queryset=self.objects,
)
self.pre_validation(formset)
if formset.is_valid():
self.save_form(formset)
return HttpResponseRedirect(self.get_success_url())
else:
return render(request, self.template_name,
self.get_context_data(formset=formset))
[docs] def pre_validation(self, formset):
"""This method can be overridden to manipulate the formset before
validation
"""
pass
def _on_request(self):
self._formset = modelformset_factory(self.form._meta.model,
form=self.form, extra=self.extra)
self.objects = self.get_queryset()
[docs] def get_queryset(self):
if self.queryset is None:
raise ImproperlyConfigured(
"Either override get_queryset, or provide a queryset class variable")
return self.queryset
[docs] def get_success_url(self):
"""Sets the success_url based on the submit button pressed"""
if self.succes_url:
return self.succes_url
raise ImproperlyConfigured("Either override get_success_url or "
"provide a success_url in FormSetUpdateView")
[docs] def get_context_data(self, **kwargs):
if 'view' not in kwargs:
kwargs['view'] = self
kwargs['objects'] = self.objects
if 'formset' not in kwargs:
kwargs['formset'] = self._formset(queryset=self.objects)
return kwargs