#26166: Accessing a widget via an index on a BoundField results in unnecessary
iteration
--------------------------------------+-------------------------------
     Reporter:  seddonym              |      Owner:  nobody
         Type:  Cleanup/optimization  |     Status:  new
    Component:  Forms                 |    Version:  1.9
     Severity:  Normal                |   Keywords:  forms, boundfield
 Triage Stage:  Unreviewed            |  Has patch:  0
Easy pickings:  0                     |      UI/UX:  0
--------------------------------------+-------------------------------
 If you access a widget via its index on a `BoundField`, the `BoundField`
 will iterate over its entire set of widgets.  This can cause large
 unnecessary overheads if you are accessing all the widgets in this way on,
 say, a `ModelChoiceField` with a large queryset, as subwidgets ''for the
 entire queryset will be generated for each widget''.

 This is related to this ticket:
 https://code.djangoproject.com/ticket/22745, and the fix here:
 
https://github.com/django/django/commit/5e06fa1469180909c51c07151692412269e51ea3

 The specific example where this caused problems for me was in a custom
 filter that helped pass the associated instance along with its associated
 checkbox widget in the template.
 (http://stackoverflow.com/a/27545910/1005499)

 Example:

 {{{
 instance_widgets = []
 index = 0
 for instance in bound_field.field.queryset.all():
      # Accessing the widget here will generate subwidgets for items in the
 queryset
      widget = copy(bound_field[index])
      instance_widgets.append((instance, widget))
      index += 1
 }}}

 If we store the instantiated subwidgets on the BoundField instance then we
 reduce this overhead:

 {{{
 # django/forms/boundfield.py

 ...
 class BoundField(object):
 ...
     def __getitem__(self, idx):
         if not isinstance(idx, six.integer_types):
             raise TypeError
         # Prevent unnecessary reevaluation when accessing BoundField's
 attrs
         # from templates.
         if not hasattr(self, '_stored_subwidgets'):
             self._stored_subwidgets = list(self.__iter__())
         return self._stored_subwidgets[idx]
 }}}

 I'm not sure if this is necessarily the correct thing to do, but I thought
 it worth reporting.  An alternative would be just to give a warning if
 widgets are being accessed in this way.

--
Ticket URL: <https://code.djangoproject.com/ticket/26166>
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/051.4cd5106c3c160dd78228e7779f7a138b%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to