Как создать собственный поиск Mixin? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть ListView, который использует параметр q GET для окна поиска. Проблема в том, что я не следую принципу DRY , так как у меня есть другие похожие окна поиска. Поэтому я хотел бы сделать пользовательский SearchMixin для обработки поисковых запросов. Мой ListView ранее выглядел так:

class MemoListView(LoginRequiredMixin, ListView):

    model = Memo
    template_name = 'memos/memos.html'
    context_object_name = 'memos'

    def get_queryset(self):
        query = self.request.GET.get('q')
        user_casino = self.request.user.casino
        user_emp_type = self.request.user.employee_type
        ordering = self.get_ordering()

        if query:
            object_list = Memo.objects.filter(
                casino=user_casino).filter(
                receiver=user_emp_type).filter(
                Q(title__icontains=query)
                | Q(content__icontains=query
                    )
            )
        else:
            object_list = Memo.objects.filter(
                casino=user_casino).filter(
                receiver=user_emp_type
            )
        return object_list

Я пытаюсь создать SearchMixin как таковой:

class SearchMixin:

    def get_queryset(self):
        queryset = super(SearchMixin, self).get_queryset()
        query = self.request.GET.get('q')

        if query:
            print('yes')
            return queryset.filter(Q(title__icontains=query)
                                   | Q(content__icontains=query))
        print('no')
        return queryset

Проблема в том, что запрос не достигает SearchMixin когда я добавляю его в MemoListView как таковой:

class MemoListView(LoginRequiredMixin, SearchMixin, ListView):

    model = Memo
    template_name = 'memos/memos.html'
    context_object_name = 'memos'

    def get_queryset(self):
        user_casino = self.request.user.casino
        user_emp_type = self.request.user.employee_type
        ordering = self.get_ordering()

        object_list = Memo.objects.filter(
            casino=user_casino).filter(
            receiver=user_emp_type)

        return object_list

Почему поиск не проходит через SearchMixin?

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вероятно, вы можете попробовать так:

Сначала обновите SearchMixin следующим образом:

class SearchMixin:
    <b>model = None</b>
    def get_queryset(self):
        <b>queryset = self.model.objects.all()</b>
        query = self.request.GET.get('q')

        if query:
            print('yes')
            return queryset.filter(Q(title__icontains=query)
                                   | Q(content__icontains=query))
        print('no')
        return queryset

Затем используйте его в MemoListView:

class MemoListView(LoginRequiredMixin, SearchMixin, ListView):
    <b>model = Memo</b>
    template_name = 'memos/memos.html'
    context_object_name = 'memos'

    def get_queryset(self):
        <b>queryset = super(MemoListView, self).get_queryset()</b>
        user_casino = self.request.user.casino
        user_emp_type = self.request.user.employee_type
        ordering = self.get_ordering()

        object_list = <b>queryset.</b>filter(
            casino=user_casino).filter(
            receiver=user_emp_type)

        return object_list
1 голос
/ 04 ноября 2019

Это не вызовет get_queryset поискового миксина, так как он переопределяется функцией get_queryset представления. Вы можете изменить имя функции get_queryset в mixin, а затем вызвать эту функцию с помощью self.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...