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.

Reply via email to