首页 > 解决方案 > 如何创建自定义搜索 Mixin?

问题描述

我有一个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

标签: djangopython-3.x

解决方案


这不会调用搜索 mixin 的 get_queryset,因为它会被视图的 get_queryset 函数覆盖。您可以在 mixin 中更改 get_queryset 函数的名称,然后使用 self 在视图中调用该函数。


推荐阅读