Как передать текущего пользователя в набор запросов Django_filters ModelChoiceFilter - PullRequest
1 голос
/ 19 февраля 2020

Как передать Текущего пользователя в Django_filters ModelChoiceFilter queryset.

Я пытаюсь отфильтровать ModelChoiceFilter на основе текущего пользователя, я использовал метод init в фильтре, но он не удался:

вот код I ' ve использовали:

views.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'

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Используйте обычный _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']
0 голосов
/ 19 февраля 2020

вы можете установить пользовательский метод. Больше информации здесь: https://django-filter.readthedocs.io/en/master/guide/usage.html#customize метод фильтрации с фильтром

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
0 голосов
/ 19 февраля 2020

Я не особо разбираюсь в Django, но я вижу, что вы не можете использовать мета-атрибуты внутри, как и self.fields, вам нужно найти другой способ сделать это.

вы Вы можете найти больше информации о том, как использовать фильтры здесь

...