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 )
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.