class ListFormSetView(ListView):
context_formset_name = "formset"
PrintStatementData = {}
def get_formset(self):
return modelformset_factory(
self.model,
form=self.form_class,
extra=0,
)
def get_context_data(self, *, object_list=None, **kwargs):
context_formset_name = self.context_formset_name
context_data = super().get_context_data(**kwargs)
object_list = context_data["object_list"]
context_data[context_formset_name] = self.get_formset()(
queryset=self.add_fields_to_queryset(object_list)
)
return context_data
def add_fields_to_queryset(self, queryset):
try:
userids_for_checked_boxes = self.PrintStatementData["to_download"][
self.PrintStatementData["list-formset-view_previous-page"]
]
except KeyError:
pass
else:
queryset = queryset.annotate(print_report_check=Case(
When(PAN_ID__in=userids_for_checked_boxes, then=True),
default=False))
for i in queryset:
print(i)
return queryset
def get_form_kwargs(self):
context_data = super().get_context_data()
object_list = context_data["object_list"]
kwargs = {
"queryset": self.add_fields_to_queryset(object_list),
}
if self.request.method in ("POST", "PUT"):
kwargs.update(
{
"data": self.request.POST,
"files": self.request.FILES,
}
)
return kwargs
# def get_initial(self, queryset=None):
# """Generate the initial data for the paginated queryset for the current page"""
# if queryset is None:
# queryset = []
# if self.request.method == "GET":
# try:
# userids_for_checked_boxes = self.PrintStatementData["to_download"][
# self.PrintStatementData["list-formset-view_previous-page"]
# ]
# except KeyError:
# pass
# else:
# for i in data:
# if i["PAN_ID"] in userids_for_checked_boxes:
# i["print_report_check"] = True
# return data
def get(self, request, *args, **kwargs):
self.PrintStatementData[
"list-formset-view_previous-page"] = int(self.request.GET.get(
self.page_kwarg))
return super().get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
formset = self.get_formset_for_previous_page()
if formset.is_valid():
return self.formset_valid(formset)
else:
return self.formset_invalid(formset)
def get_formset_for_previous_page(self):
"""Set the `page_kwarg` 's value to the previous page's value because
the formset's data needs to be compared to the previous page's data.
The `paginate_queryset` method uses self.kwargs["page_kwarg"]
to get the queryset corresponding to a page.So just to get the
initial data corresponding to the previous page through `self.get_form_kwargs` we first need to do this."""
self.PrintStatementData[
"list-formset-view_current-page"] = int(self.request.GET.get(
self.page_kwarg))
self.kwargs[self.page_kwarg] = self.PrintStatementData.get(
"list-formset-view_previous-page")
formset = self.get_formset()(**self.get_form_kwargs())
self.kwargs[self.page_kwarg] = self.PrintStatementData.get(
"list-formset-view_current-page")
return formset
def formset_valid(self, formset):
return HttpResponseRedirect(self.get_success_url())
def formset_invalid(self, formset):
print(formset.errors)
return self.render_to_response(self.get_context_data(formset=formset))