简体   繁体   English

如何将当前用户传递给 Django_filters ModelChoiceFilter 查询集

[英]How to pass Current user to Django_filters ModelChoiceFilter queryset

How to pass Current user to Django_filters ModelChoiceFilter queryset.如何将当前用户传递给Django_filters ModelChoiceFilter

I'm trying to filter the ModelChoiceFilter based on the current user , i've used the init method in the filter but it failed:我正在尝试根据当前用户过滤ModelChoiceFilter ,我在过滤器中使用了init方法,但它失败了:

here is the code I've used :这是我使用的代码:

views.py视图.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表格.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]使用正常_init_但不是self.fields['field_name]使用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']

I don't have much experiance in Django, but what I see is you can not use meta attributes inside just like self.fields , you have to find another way to do it.我在 Django 中没有太多经验,但我看到你不能像self.fields一样在内部使用元属性,你必须找到另一种方法来做到这一点。

you can find more information on how to use filtershere您可以在此处找到有关如何使用过滤器的更多信息

you can set a custom method.您可以设置自定义方法。 More info here: https://django-filter.readthedocs.io/en/master/guide/usage.html#customize-filtering-with-filter-method更多信息: 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

You can access the following in the init of the filterset:您可以在过滤器集的初始化中访问以下内容:

user = kwargs['request'].user

For example, this is from my project but I hope it helps someone:例如,这是来自我的项目,但我希望它可以帮助某人:

class MenuItemListFilter(django_filters.FilterSet):
    def __init__(self, *args, **kwargs):
        user = kwargs['request'].user
        super().__init__(*args, **kwargs)
        self.filters['section'].queryset = MenuSection.objects.filter(business=user.business)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM