如何将当前用户传递给Django_filters的ModelChoiceFilter查询集
解决Django FilterSet中
'RequestsFilter' object has no attribute 'fields'错误 我来帮你搞定这个问题!你遇到的这个错误其实是个常见的小坑,原因和解决方案如下:
错误原因
FilterSet类的Meta里定义的fields只是用来声明要生成哪些过滤器的配置项,FilterSet实例并没有fields这个属性。实际存储过滤器实例的是self.filters字典,所以你尝试访问self.fields['employee']自然会报错。
修正后的代码
forms.py
import django_filters from django import forms from .models import LeaveRequest, Employee class RequestsFilter(django_filters.FilterSet): def __init__(self, *args, **kwargs): self.user = kwargs.pop('user') # 先调用父类初始化方法,确保过滤器实例被创建 super().__init__(*args, **kwargs) # 关键修正:使用self.filters而非self.fields来访问过滤器 self.filters['employee'].queryset = Employee.objects.filter(user=self.user) start_date = django_filters.DateFilter( field_name='date_time', lookup_expr='gt', widget=forms.TextInput(attrs={'type': 'date'}) ) end_date = django_filters.DateFilter( field_name='date_time', lookup_expr='lt', widget=forms.TextInput(attrs={'type': 'date'}) ) class Meta: model = LeaveRequest fields = ['employee', 'type']
views.py(你的原代码没问题,这里确认一下)
from django.shortcuts import render from .models import LeaveRequest from .forms import RequestsFilter 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)
额外注意点
- 确保你的
Employee模型中存在user字段,并且该字段与Django的用户模型(或自定义用户模型)关联,这样Employee.objects.filter(user=self.user)才能正确筛选出当前用户对应的员工数据。 - 如果
LeaveRequest中的employee字段是外键关联到Employee模型,FilterSet会自动为它生成ModelChoiceFilter,修改其queryset就能实现只显示当前用户有权限查看的员工选项的效果。
内容的提问来源于stack exchange,提问作者amgad wagdy
相关产品推荐
相关产品推荐

