Как применить пользовательский фильтр к django фильтрам ModelChoicefilter - PullRequest
1 голос
/ 24 февраля 2020

Я использую Django Filter для фильтрации данных в моем Django проекте.

Теперь мне нужно отфильтровать некоторые параметры c ModelChoiceFilter на основе текущего зарегистрированного пользователя.

Я пытался отправить данные с помощью def _init_ в форму, а затем выполнить фильтрацию с помощью self.fields['field_name'].queryset = my_qs, но это дает мне неразрешенную ошибку для self.filters.

Наконец, я использовал опции Filter.Method из Django Filter , вот мой код:

просмотров .py

    f = RequestsFilter(request.GET,
                       queryset=LeaveRequest.objects.filter(user=request.user),user=request.user.id)

forms.py

class RequestsFilter(django_filters.FilterSet):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super().__init__(*args, **kwargs)
    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(field_name='employee', method="filter_employee",
                                                queryset=Employee.objects.filter())

    class Meta:
        model = LeaveRequest
        fields = ['employee', 'type', 'date_time']

    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

Это больше не приводит к ошибке, но поле employee по-прежнему показывает все сотрудники в базе данных, не фильтруя ее на основе пользователя.

...