Django form queryset filter using request user

Я хочу отфильтровать набор запросов, используя текущие данные пользователя, но он возвращает только None. Предположим, когда я удаляю None, он выдает ошибку user can't recognize

В Forms.py

class oldenquiryForm(forms.ModelForm):
    class Meta:
        model=enquiry
        fields=['product','type','created_at']
        widgets={
            'created_at':forms.DateInput(attrs={'type':'date'}),
        }
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        user = kwargs.pop('user', None)
        super(oldenquiryForm, self).__init__(*args, **kwargs)
        employee = emp.objects.filter(branch=user.admin.branch_name).values_list('firstname',flat=True)
        print (employee)
        self.fields['created_by'].queryset=emp.objects.filter(branch=user.admin.branch_name).values_list('firstname',flat=True)

Вы должны вызывать суперконструктор без поля user, удалив его из именованных параметров, например, добавив user=None к сигнатуре:

class OldEnquiryForm(forms.ModelForm):
    def __init__(self,*args, user=None, **kwargs):
        super(oldenquiryForm, self).__init__(*args, **kwargs)
        if user is not None:
            self.fields['created_by'].queryset = emp.objects.filter(branch=user.admin.branch_name)

    class Meta:
        model=enquiry
        fields=['product','type','created_at']
        widgets={
            'created_at':forms.DateInput(attrs={'type':'date'}),
        }

Затем в представлении вы создаете форму с зарегистрированным пользователем как user:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect

@login_required
def enquirys(request):
    if request.method == 'POST':
        form = OldEnquiryForm(request.POST, request.FILES, user=request.user)
        if form.is_valid():
            form.save()
            return redirect('name-of-some-view')
    else:
        form = OldEnquiryForm(user=request.user)
    return render(request,'enquirys.html',{'form':form})

Возможно, вам также следует построить модель для филиала и использовать ForeignKey для реализации нормализации базы данных [wiki].


Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора @login_required декоратора [Django-doc].


Примечание: В случае успешного POST запроса, вы должны сделать redirect. [Django-doc] для реализации паттерна Post/Redirect/Get [wiki]. Это позволяет избежать повторения POST-запроса, когда пользователь обновляет браузер. браузер.

Вернуться на верх