#20744: Docs imply that forms.Field.__init__ accepts any keyword arguments
-------------------------------+--------------------
     Reporter:  gthb           |      Owner:  nobody
         Type:  Bug            |     Status:  new
    Component:  Documentation  |    Version:  master
     Severity:  Normal         |   Keywords:
 Triage Stage:  Unreviewed     |  Has patch:  0
Easy pickings:  0              |      UI/UX:  0
-------------------------------+--------------------
 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
 [https://github.com/jezdez/django-
 
authority/blob/11461f808160e09bb992f9c602c342718892bb6a/authority/admin.py#L28-L33
 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.)

-- 
Ticket URL: <https://code.djangoproject.com/ticket/20744>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/047.448948d82dcc4e0869c36bbbee796246%40djangoproject.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to