Search code examples
pythondjangodjango-filter

How to pass Current user to Django_filters ModelChoiceFilter queryset


How to pass Current user to Django_filters ModelChoiceFilter queryset.

I'm trying to filter the ModelChoiceFilter based on the current user , i've used the init method in the filter but it failed:

here is the code I've used :

views.py

def requests_reports(request):
    f = RequestsFilter(request.GET, queryset=LeaveRequest.objects.filter(user=request.user), user=request.user)
    context = {
        'filter': f,
    }
    return render(request, 'requests_reports.html', context)

forms.py

class RequestsFilter(django_filters.FilterSet):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(RequestsFilter, self).__init__(*args, **kwargs)
        self.fields['employee'].queryset = Employee.objects.filter(user=self.user)

    start_date = DateFilter(field_name='date_time', lookup_expr='gt', widget=forms.TextInput(attrs={'type': 'date'}))
    end_date = DateFilter(field_name='date_time', lookup_expr='lt', widget=forms.TextInput(attrs={'type': 'date'}))

    class Meta:
        model = LeaveRequest
        fields = ['employee', 'type']

It returns this error :

'RequestsFilter' object has no attribute 'fields'

Solution

  • Use the normal _init_ but instead of self.fields['field_name] use self.filters[field_name]

    Try this code:

    class RequestsFilter(django_filters.FilterSet):
        def __init__(self, *args, **kwargs):
            self.user = kwargs.pop('user')
            super().__init__(*args, **kwargs)
            self.filters['employee'].queryset = Employee.objects.filter(user=self.user)
        start_date = DateFilter(field_name='date_time', lookup_expr='gt', widget=forms.TextInput(attrs={'type': 'date'}))
        end_date = DateFilter(field_name='date_time', lookup_expr='lt', widget=forms.TextInput(attrs={'type': 'date'}))
        employee = django_filters.ModelChoiceFilter(queryset=None, field_name='employee' )
        class Meta:
            model = LeaveRequest
            fields = ['employee', 'type', 'date_time']