Как получить текущего пользователя в формах?

В моем проекте Django есть форма. В этой форме я могу назначить человека. Вот моя форма:

class AssignForm(forms.ModelForm):
    user = forms.ModelChoiceField(
        queryset=UserProfile.objects.filter(is_active=True)
        label=_(u'User')
    )

    class Meta:
        model = Customer
        fields = ('user',)

Я хочу добавить еще один фильтр в эту форму. Это company. Я получаю список всех пользователей в этой форме, но я хочу только перечислить пользователей, которые принадлежат компании текущего пользователя. Так что это должно быть :

queryset=UserProfile.objects.filter(is_active=True, company = current_user.company)

Но я не могу получать запросы из форм. Как я могу с этим справиться?

Вы должны передать request.user из views.py, чтобы получить его в форме. В вашей форме напишите эту функцию __init__ и передайте пользователя из views.py, и вы сможете получить пользователя. Вы можете получить доступ к пользователю как self.user в вашей форме

class AssignForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.get('user')
        kwargs.pop('user')

В вашем файле views.py вызовите форму следующим образом

form = AssignForm(user=request.user)

Вы переопределяете конструктор формы с:

class AssignForm(forms.ModelForm):
    user = forms.ModelChoiceField(
        queryset=UserProfile.objects.filter(is_active=True)
        label=_(u'User')
    )

    def __init__(self, *args, user=None, **kwargs):
        super().__init__(*args, **kwargs)
        if user is not None:
            self.fields['user'].queryset = UserProfile.objects.filter(
                is_active=True, company__userprofile=user
            )

    class Meta:
        model = Customer
        fields = ('user',)

Затем в представлении вы передаете вошедшего пользователя:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    if request.method == 'POST':
        form = AssignForm(request.POST, request.FILES, user=request.user)
        # …
    else:
        form = AssignForm(user=request.user)
    # …
Вернуться на верх