Я считаю, что в этом случае вам нужно использовать параметр form при вызове inlineformset_factory и передать его в пользовательскую форму, созданную с помощью специального метода __init__
.
Если вам нужно, чтобы это было параметрическим, я нашел здесь некоторое время назад спасительную линию
FormSetName.form = staticmethod(curry(FormName, customparam=chosenparam))
где, как объяснено выше, FormSetName был определен с параметром form , указывающим на FormName.
Кстати, хотелось бы отдать должное человеку, предложившему вышеупомянутое решение, хотел бы оставить душераздирающий ответ, но слишком мало репутации.
изменить, чтобы лучше объяснить мое решение:
Это будет пользовательский класс формы (в данном случае, чтобы выбрать человека в качестве родственника , но только среди подгруппы людей, возвращенных родственники () метод):
class RelativeSelectForm(forms.ModelForm):
class Meta:
model = Person
fields = ('relative',)
def __init__(self, *args, **kwargs):
try:
profile = kwargs.pop('profile')
except KeyError:
super(RelativeSelectForm, self).__init__(*args, **kwargs)
return
super(RelativeSelectForm, self).__init__(*args, **kwargs)
self.fields['relative'].queryset = profile.relatives().order_by('name')
и он будет использоваться следующим образом, в вашем vies.py :
RelativesFormSet = inlineformset_factory(Person, Person, form=RelativeSelectForm, can_delete=True, extra=1)
RelativesFormSet.form = staticmethod(curry(RelativeSelectForm, profile=request.user.profile))
, так что каждый раз, когда вы создаете экземпляр формы, он автоматически получает параметр profile , заполненный нужным объектом, и набор запросов для поля выбора относительно показывает только людей, к которым он имеет доступ.
Надеюсь, я немного прояснил:)