Это основная проблема Python. Вам нужно подумать о порядке выполнения этих команд и их объеме.
Сначала вы определяете класс формы с именем Test. Этот класс имеет три атрибута: метод set_choices
, метод get_choices
и поле options
. Эти определения оцениваются, когда определяется сам класс. Определение options
вызывает get_choices()
. Однако на данный момент в области действия нет метода get_choices
, поскольку класс еще не определен.
Даже если вам каким-то образом удалось решить проблему с областью действия, это все равно не даст желаемого результата, поскольку определение вариантов для options
выполняется в определенное время. Даже если вы позже позвоните set_choices
, options
все равно будет иметь значение get_choices
, которое было возвращено при определении поля.
Итак, что вы на самом деле хотите сделать? Кажется, вы хотите установить динамический выбор в поле options
. Итак, вы должны переопределить метод __init__
и определить их там.
class Test(forms.Form):
options = forms.ChoiceField(choices=())
def __init__(self, *args, **kwargs):
choices = kwargs.pop('choices', None)
super(Test, self).__init__(*args, **kwargs)
if choices is not None:
self.fields['options'].choices = choices