django - 如何创建自定义搜索 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
?
解决方案
这不会调用搜索 mixin 的 get_queryset,因为它会被视图的 get_queryset 函数覆盖。您可以在 mixin 中更改 get_queryset 函数的名称,然后使用 self 在视图中调用该函数。
推荐阅读
- python - 读取有时包含多个空格的 CSV
- c# - 我可以从在云中运行的 .NET 应用程序执行单元测试吗?
- javascript - 为 Thunderbird Firefox 编写 Web 扩展
- python - Pandas Dataframe 将列解释为浮点数而不是字符串
- sql - SQL Server 进入 outfile QUERY
- javascript - 节点/MongoDB异步等待场景中的UnhandledPromiseRejectionWarning
- android - 如何使用 MaterialComponents 正确显示 DatePickerDialog?
- r - 用函数评估多项式
- c# - UI 自动化:打开文件对话框元素树不包含所有元素
- javascript - 使用手机时的结果与使用 PC 时不同