如何将当前用户传递给Django_filters ModelChoiceFilter queryset

2024-09-29 21:22:18 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将当前用户传递给Django_filters{}queryset

我正在尝试根据当前用户筛选ModelChoiceFilter,我在筛选中使用了init方法,但失败了:

以下是我使用的代码:

视图.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']

它返回以下错误:

'RequestsFilter' object has no attribute 'fields'

Tags: 用户pyselffieldsdateinitrequesttype
3条回答

使用正常的_init_,但不使用self.fields['field_name],而是使用self.filters[field_name]

请尝试以下代码:

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

您可以设置自定义方法。更多信息请点击此处:https://django-filter.readthedocs.io/en/master/guide/usage.html#customize-filtering-with-filter-method

class RequestsFilter(django_filters.FilterSet):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super().__init__(*args, **kwargs)

    employee = django_filters.filters.ModelMultipleChoiceFilter(
        field_name='employee',
        queryset=Employee.objects.all(),
        method="filter_employee",
    )
    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']

    def filter_employee(self, queryset, name, value):
        qs = queryset.filter(user=self.user).filter(**{name: value})
        if len(qs) >= 1:
            return qs[0]
        else:
            return None

我在Django方面没有太多经验,但我看到的是,您不能像self.fields那样在内部使用元属性,您必须找到另一种方法

您可以找到有关如何使用筛选器here的详细信息

相关问题 更多 >

    热门问题