Передайте параметр request.user в форму modelformset_factory
Итак, у меня есть набор форм, привязанный к модели, и одно из полей в нем ForeignKey
.
models.py
class Squad(models.Model):
rid = models.AutoField(primary_key=True)
team = models.ForeignKey(Team, on_delete=models.CASCADE)
def __str__(self):
return self.team.tname
forms.py
class SquadForm(ModelForm):
class Meta:
model = Squad
def __init__(self, logged_user, user, *args, **kwargs):
super(SquadForm, self).__init__(*args, **kwargs)
self.fields['team'] = forms.ModelChoiceField(queryset=Team.rows.get_my_teams(user=logged_user), empty_label="None")
Как вы видите, функция __init__
ожидает дополнительный параметр logged_user
, который я надеюсь передать через файл views.py. Но если я сделаю следующее:
views.py
def choose_teams(request):
teamformset = modelformset_factory(Squad, extra=2, form=SquadForm(request.user))
form = teamformset(queryset=Squad.objects.none())
return render(request, 'foo.html', {'form':form})
Я пытаюсь передать вошедшего пользователя в качестве параметра в строке 2, но это приводит к следующему сообщению:
Поле 'id' ожидало число, но получило 'SquadForm'
Не уверен, что я здесь упускаю. Но если я удалю параметр из строки 2:
teamformset = modelformset_factory(Squad, extra=series.team_number, form=SquadForm)
он начинает работать (конечно, я больше не ожидаю пользователя в файле forms.py и удаляю его тоже), но показывает все данные, а не отфильтрованные.
Вы можете передать дополнительные аргументы ключевых слов в форму вашего набора форм, передав form_kwargs={} в ваш набор форм
class SquadForm(ModelForm):
class Meta:
model = Squad
def __init__(self, *args, logged_user, **kwargs):
super(SquadForm, self).__init__(*args, **kwargs)
self.fields['team'] = forms.ModelChoiceField(queryset=Team.rows.get_my_teams(user=logged_user), empty_label="None")
teamformset = modelformset_factory(Squad, extra=2, form=SquadForm)
form = teamformset(queryset=Squad.objects.none(), form_kwargs={'logged_user': request.user})