ОК, пару небольших замечаний, прежде чем я отвечу на ваш вопрос.
Во-первых, ваше поле, вероятно, должно быть ModelChoiceField
- для этого требуется параметр queryset
, а не список вариантов, что исключает необходимость понимания списком, чтобы получить идентификатор и значение.
Во-вторых, ваш запрос на получение объектов Objtree гораздо лучше написан с использованием нотации двойного подчеркивания для обхода отношений:
Objtree.objects.filter(type__name='group', parent_id=50)
Теперь актуальный вопрос. Как вы заметили, вы не можете получить доступ к локальным переменным или переменным экземпляра в объявлениях полей. Это атрибуты уровня класса, которые обрабатываются (через метакласс) при определении класса, а не при его создании. Так что вам нужно сделать все это в __init__
.
Как это:
class GroupAdd(forms.Form):
parent_id = forms.IntegerField(widget=forms.HiddenInput)
choices = forms.ModelChoiceField(queryset=None)
def __init__(self, *args, **kwargs):
pid = kwargs.pop('parent_id', None)
super(GroupAdd, self).__init__(*args, **kwargs)
self.fields['choices'].queryset = Objtree.objects.filter(
type__name='group', parent_id=pid
)