Opened 4 years ago

Last modified 4 years ago

#31961 closed Bug

forms.ChoiceField calls choices callback multiple times. — at Version 1

Reported by: Roy Smith Owned by: nobody
Component: Forms Version: 2.2
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Roy Smith)

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.

Change History (1)

comment:1 by Roy Smith, 4 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top