no info on extra fields in the modelformset docs

11 views
Skip to first unread message

VISHESH MANGLA

unread,
Jun 14, 2021, 4:11:46 PM6/14/21
to Django users
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(selfcommit=True):
        logger.info(" Method not meant to save anything ")
        pass
```



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_boxesthen=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(selfqueryset):
            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_boxesthen=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(selfrequest, *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(selfrequest, *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(selfformset):
        return HttpResponseRedirect(self.get_success_url())

    def formset_invalid(selfformset):
        print(formset.errors)
        return self.render_to_response(self.get_context_data(formset=formset))

```
Reply all
Reply to author
Forward
0 new messages