Opened 5 years ago
Last modified 5 years ago
#31961 closed Bug
forms.ChoiceField calls choices callback multiple times. — at Initial Version
| 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
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.