You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将当前用户传递给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:54:03