Hello, I 'm trying to use a modelformset with extra form fields but the docs say nothing about it. The initial data corresponding to the model fields gets loaded. I 'm stuck on this view(posted at the end) from previous 4 days, please help someone. The extra field is ` print_report_check`.
form ``` class PrintReportModelForm(ModelForm): print_report_check = forms.BooleanField(widget=forms.CheckboxInput(), required=False) class Meta: fields = ["PAN_ID", "print_report_check"] model = User widgets = {"PAN_ID": forms.HiddenInput()} def save(self, commit=True): logger.info(" Method not meant to save anything ") pass ``` https://docs.djangoproject.com/en/3.2/topics/forms/modelforms/#id2 To my queryset returned by get_queryset I added this field. ``` queryset = queryset.annotate(print_report_check=Case( When(PAN_ID__in=userids_for_checked_boxes, then=True), default=False)) ``` ```view 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 )) ``` -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/1128898a-4f77-4ac4-8a82-888ed3302412n%40googlegroups.com.