Opened 7 years ago

Last modified 4 years ago

#18166 closed New feature

Allow the formset class to contribute kwargs to form instances — at Initial Version

Reported by: tevans Owned by: nobody
Component: Forms Version: master
Severity: Normal Keywords: forms formset kwargs
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

When we use a formset, each form is instantiated by the method BaseFormSet._construct_forms(), which is called from BaseFormSet.init()

_construct_forms() allows for additional kwargs to be passed through to the individual form constructor, but BaseFormSet.init() does not provide any mechanism for kwargs to be passed through to the _construct_forms() call.

Also, we may not be able to supply a static unchanging list of kwargs that should be supplied to each form constructor - the kwargs we want to pass may depend upon the specific instance of the form being instantiated.

I propose the following changes:

Add a form_kwargs argument to BaseFormSet.init(). This would be stored on self, and consumed in BaseFormSet._construct_forms()

Add a method, BaseFormSet._kwargs_for_form(self, i). This method would be called for each form instantiated, passing the index of the form within the formset. The return value of this method would be merged with the form_kwargs supplied in BaseFormSet.init() and used to instantiate the form.

With these changes, a user could add additional constructor arguments to all forms by passing in form_kwargs to the formset constructor, and could add additional constructor arguments to specific forms by implementing _kwargs_for_form on a derived BaseFormSet class.

(I found it strange, when BaseFormSet was written, it was clearly intended to be able to pass kwargs to the forms - _construct_form() allows for it, there just is not the plumbing to do so. I worked around this by redefining - copy/pasting - the _construct_forms() method in my derived BaseFormSet class)

Patch doesn't have tests or doc changes, will add if this idea gets traction.

Cheers

Tom

Change History (1)

Changed 7 years ago by tevans

Patch implementing features described in ticket

Note: See TracTickets for help on using tickets.
Back to Top