#20744 closed Bug (fixed)
Docs imply that forms.Field.__init__ accepts any keyword arguments
Reported by: | Gunnlaugur Þór Briem | Owned by: | Adam Zapletal |
---|---|---|---|
Component: | Documentation | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Pashkin, Adam Zapletal | Triage Stage: | Ready for checkin |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
At https://docs.djangoproject.com/en/dev/ref/forms/fields/ there is this:
class Field(**kwargs)
with no stated constraints on kwargs
, thus implying (incorrectly) that any keyword argument can safely be passed to the forms.Field
constructor.
That leads to code which worked in previous Django versions but regresses in the current version. The case I have in mind is in django-authority's admin.py where the kwargs
passed to formfield_callback
(which can include request
) are passed on to Field.formfield
, whose documentation says “All of the kwargs
dictionary is passed directly to the form field’s __init__()
method” ... and that __init__
method can't include request
. So upgrading Django yields this somewhat tricky-to-troubleshoot error in a django-authority admin action:
TypeError: __init__() got an unexpected keyword argument 'request' ... File "django/forms/models.py", line 170, in fields_for_model formfield = formfield_callback(f, **kwargs) File "authority/admin.py", line 33, in formfield_for_dbfield return db_field.formfield(**kwargs) File "django/db/models/fields/__init__.py", line 646, in formfield return super(CharField, self).formfield(**defaults) File "django/db/models/fields/__init__.py", line 499, in formfield return form_class(**defaults) File "django/forms/fields.py", line 188, in __init__ super(CharField, self).__init__(*args, **kwargs)
At some point in this chain, the request
keyword argument must be popped out. Presumably directly before the call to Field.formfield
. In any case, this requirement should be documented.
(Or forms.Field.__init__
could be changed to tolerate and ignore unknown keyword arguments. But that's a riskier change.)
Change History (6)
comment:1 by , 11 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:2 by , 11 years ago
Cc: | added |
---|
comment:3 by , 8 months ago
Cc: | added |
---|---|
Has patch: | set |
Owner: | changed from | to
Status: | new → assigned |
comment:4 by , 8 months ago
Triage Stage: | Accepted → Ready for checkin |
---|
I opened a simple pull request changing
.. class:: Field(**kwargs)
to
.. class:: Field
in the docs. That's how the
Form
class is documented.