Изменение набора запросов django -фильтра с возможностью вызова - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь изменить набор запросов одного из моих ModelChoiceFilters, чтобы он зависел от пользователя, который к ним обращается.

Моя вызываемая функция выглядит следующим образом: (filters.py)

def is_client(request):

    if request is None:
        return Project.objects.none()

    return Project.objects.all()

Эта функция, вызываемая в классе фильтра, выглядит следующим образом: (filters.py)

class ReportFilter(django_filters.FilterSet):

    project = django_filters.ModelChoiceFilter(field_name='project_name',
                                               label='Project',
                                               queryset=is_client)

    class Meta:
        model = Report
        fields = ['project']

При таком кодировании всегда запускается первое условие в is_client. Когда я пытаюсь поиграть с ним и сделать что-то с request.user ..., я получаю ошибку: у объекта 'NoneType' нет атрибута 'user'.

Я сделал так, чтобы набор запросов, который фильтр создается с учетом ограничений, доступных для определенных пользователей, однако они по-прежнему могут видеть опции, которые им недоступны в фильтре (даже если они выберут его, ничего не будет возвращено): (views.py)

@login_required
def home(request):
    if is_employee(request.user):
        reports = ConcreteReport.objects.all()
    else:
        client = request.user.id
        reports = ConcreteReport.objects.filter(project_name__company__user__id=client)

    myFilter = ReportFilter(request.GET, queryset=reports)

    context = {'reports':reports,
               'myFilter':myFilter}

    return render(request, 'dashboard/home.html', context)

Я не могу понять, почему запрос является NoneType, так как я использую его в представлении для других целей и имеет атрибуты.

Любая помощь приветствуется, я не сделал я не буду публиковать более подробную информацию, поскольку я думаю, что это более общий вопрос о том, как работает django -фильтр.

РЕДАКТИРОВАТЬ

Я нашел решение для эта проблема была скрыта в слегка связанной теме: Настройка набора запросов в меню django -фильтров ModelChoiceFilter (выберите) и ModelMultipleChoiceFilter (множественный выбор) на основе запроса

Что у вас есть для этого просто передайте запрос экземпляру фильтра.

ex:

myFilter = ReportFilter(request.GET, request=request, queryset=reports)
...