#31961: forms.ChoiceField calls choices callback multiple times.
---------------------------+--------------------------------------
     Reporter:  Roy Smith  |                    Owner:  nobody
         Type:  Bug        |                   Status:  new
    Component:  Forms      |                  Version:  2.2
     Severity:  Normal     |               Resolution:
     Keywords:             |             Triage Stage:  Unreviewed
    Has patch:  0          |      Needs documentation:  0
  Needs tests:  0          |  Patch needs improvement:  0
Easy pickings:  0          |                    UI/UX:  0
---------------------------+--------------------------------------
Description changed by Roy Smith:

Old description:

> I'm running:
>
> Python 3.7
> Django 2.2
> Debian 4.9
>
> If I configure a forms ChoiceField with a callback function for choices,
> it gets called twice each time I render the form:
>

> {{{
> from unittest import TestCase
> from django import forms
>
> def callback():
>     print("callback")
>     return [('foo', 'bar')]
>
> class MyForm(forms.Form):
>     f = forms.ChoiceField(choices=callback)
>

> class FormTest(TestCase):
>     MyForm().as_p()
> }}}
>
> prints:
>
> {{{
> ./manage.py test spi.test_f
> callback
> callback
> System check identified no issues (0 silenced).
>
> ----------------------------------------------------------------------
> Ran 0 tests in 0.000s
>
> OK
> }}}
>
> This is the same sort of problem described in #26665 and/or #11390.  It's
> an obvious performance issue, but more than that, if can beak behavior if
> the callback is non-idempotent.
>
> I discovered this because I had patched my callback using unttest.mock to
> return a sequence of return values and got hard-to-diagnose test
> failures.  Specifically, my test failed because it raised StopIteration
> when it ran out of values to return.

New description:

 I'm running:

 Python 3.7
 Django 2.2
 Debian 4.9

 If I configure a forms ChoiceField with a callback function for choices,
 it gets called twice each time I render the form:


 {{{
 from unittest import TestCase
 from django import forms

 def callback():
     print("callback")
     return [('foo', 'bar')]

 class MyForm(forms.Form):
     f = forms.ChoiceField(choices=callback)


 class FormTest(TestCase):
     MyForm().as_p()
 }}}

 prints:

 {{{
 ./manage.py test spi.test_f
 callback
 callback
 System check identified no issues (0 silenced).

 ----------------------------------------------------------------------
 Ran 0 tests in 0.000s

 OK
 }}}

 This is the same sort of problem described in #26665 and/or #11390.  It's
 an obvious performance issue, but more than that, it can beak behavior if
 the callback is non-idempotent.

 I discovered this because I had patched my callback using unttest.mock to
 return a sequence of return values and got hard-to-diagnose test failures.
 Specifically, my test failed because it raised StopIteration when it ran
 out of values to return.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/31961#comment:1>
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/066.d8965a7f34bf78ef2400c141c0eaeb02%40djangoproject.com.

Reply via email to