﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
31961	forms.ChoiceField calls choices callback multiple times.	Roy Smith	nobody	"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.

"	Bug	new	Forms	2.2	Normal				Unreviewed	0	0	0	0	0	0
