Тот факт, что __init__
находится в середине класса, не будет иметь никакого значения, поскольку это функция, и поэтому оценка "откладывается" до тех пор, пока вы фактически не создадите объект формы MakePurchaseLog
.
Я думаю, что самое элегантное решение здесь - просто определить поле в вашей форме, а затем в функции __init__
изменить варианты, например:
class MakePurchaseLog(forms.Form):
buy_date = forms.DateField(input_formats=['%Y-%m-%d'])
shop = forms.CharField(max_length=50)
<b>category_name = forms.ChoiceField()</b>
goods_name = forms.CharField(max_length=50)
price = forms.IntegerField(min_value=0)
memo = forms.CharField(max_length=50, required=False)
def __init__(self, user, *args, **kwargs):
super(MakePurchaseLog, self).__init__(*args, **kwargs)
<b>self.fields['category_name'].choices</b> = [
(item.category_name, item.category_name)
for item in Category_name.objects.filter(owner=user)
]
Таким образом, мы заполняем choices
поля category_name
в функции __init__
, но мы определяем поле уже на уровне класса.