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'
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']