#18166 closed New feature (fixed)
Allow the formset class to contribute kwargs to form instances
Reported by: | tevans | Owned by: | Sergei Maertens |
---|---|---|---|
Component: | Forms | Version: | dev |
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 (last modified by )
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
Attachments (1)
Change History (13)
by , 13 years ago
Attachment: | django-formset-form-kwargs.diff added |
---|
follow-up: 3 comment:1 by , 13 years ago
Hmm, wiki markup that turns __init__ into init is less than useful for Python discussion :/
comment:2 by , 13 years ago
Needs documentation: | set |
---|---|
Needs tests: | set |
comment:3 by , 13 years ago
Description: | modified (diff) |
---|
Replying to tevans:
Hmm, wiki markup that turns __init__ into init is less than useful for Python discussion :/
You can use formatting: {{{ __init__ }}} will show as __init__
. There's both live preview and a preview button.
follow-up: 5 comment:4 by , 13 years ago
Just as an idea: how about defining a new method:
def get_single_form(self, i, defaults): """ Override me to have total control over the single forms. """ return self.form(**defaults)
and use that instead of self.form() in the _construct_form() method. This would be more powerful and easier to implement.
comment:5 by , 13 years ago
Replying to akaariai:
Just as an idea: how about defining a new method:
def get_single_form(self, i, defaults): """ Override me to have total control over the single forms. """ return self.form(**defaults)and use that instead of self.form() in the _construct_form() method. This would be more powerful and easier to implement.
Yes, I like that. I would like to also keep the idea of being able to contribute to a form's kwargs without defining a BaseFormSet
subclass, eg by passing them to BaseFormSet.__init__
.
I should get some time this w/e to re-roll the patch.
comment:6 by , 13 years ago
Patch needs improvement: | set |
---|---|
Triage Stage: | Unreviewed → Accepted |
Agreed, a method for implementing this is a good idea, but please let's skip the redundant 'simple' prefix, just call it get_form
.
comment:8 by , 10 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:10 by , 10 years ago
Needs documentation: | unset |
---|---|
Needs tests: | unset |
Patch needs improvement: | unset |
Patch implementing features described in ticket