Я пытаюсь изменить набор запросов одного из моих 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)