Django: get_queryset после get_context_data

#python #django #django-queryset

#python #django #django-набор запросов

Вопрос:

Я фильтрую объекты модели моего проекта по аутентифицированному пользователю, используя get_context_data в моем ListView

 class myprojects(LoginRequiredMixin, ListView):
    model = Project
    template_name = 'my_project_list.html'
    ordering = ['project_title']

    def get_context_data(self, *args, **kwargs):
        context = super(myprojects, self).get_context_data(**kwargs)
        context['my_projects'] = Project.objects.filter(engineer=self.request.user)
        return context
 

В шаблоне

 {% for my_project in my_projects %}
{{ my_project }}
{% endfor %}
 

В моем шаблоне есть форма для поиска проектов, и я использую get_queryset в том же ListView. Я получаю поиск, но он не фильтруется в шаблоне

 class myprojects(LoginRequiredMixin, ListView):
    model = Project
    template_name = 'my_project_list.html'
    ordering = ['project_title']

    def get_context_data(self, *args, **kwargs):
        context = super(myprojects, self).get_context_data(**kwargs)
        context['my_projects'] = Project.objects.filter(engineer=self.request.user)
        return context

    def get_queryset(self, *args, **kwargs):
        context = super().get_queryset(*args, **kwargs)
        search = self.request.GET.get('buscar', None)
        print(search)
        if search:
            context = context.filter(
                Q(project_title__icontains=search) |
                Q(category__title__icontains=search)
            ).distinct()
        return context
 

Примечание: когда я использую {% for project in object_list %} вместо {% for project in my_projects %} , он выполняет поиск без проблем, но у меня больше нет фильтра по пользователю

Ответ №1:

Просто фильтруйте внутри метода get_queryset

 def get_queryset(self, *args, **kwargs):
    queryset = super().get_queryset(*args, **kwargs)
    search = self.request.GET.get('buscar', None)
    queryset = queryset.filter(engineer=self.request.user)
    if search:
        queryset = queryset.filter(
            Q(project_title__icontains=search) |
            Q(category__title__icontains=search)
        ).distinct()
    return queryset
 

Комментарии:

1. Большое вам спасибо, вы сэкономили мне часы исследований. Да благословит тебя Бог, друг