Передайте параметр 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})
Вернуться на верх