如何在django中使用相同的列表视图进行搜索和类别查询集



我试图在我的Django应用程序中构建功能,我们可以通过两种方法获得数据:

使用搜索
  1. 选择类别

因为它们都需要从数据集获取数据,我想知道是否有一种方法可以利用相同的ListView(不是CBV)来输出数据。

urls . py

path('datalist/<slug:category_slug>/' views.problemlist, name="problem_list_category"),
path('datalist/search/' views.problemlistbysearch, name="problem_list_search"),

views.py


def problemlist(request, category_slug):
qs = DataModel.objects.get(category_slug=category_slug)
return render(request,'list.html',{'qs':qs} )
def problemlistbysearch(request):
if request.method == 'GET':
query = request.GET.get('name')
objlst = DataModel.objects.all()
qs = objlst.filter(title__icontains=query)
return render(request, 'search.html', {'qs':qs})

函数式视图(FBV)

您可以让url指向urlpatterns中的相同视图(problem_list):

urlpatterns = [
# ⋮,
path('datalist/search/', views.problemlist, name='problem_list_search'),
path('datalist/<slug:category_slug>/', views.problemlist, name='problem_list_category'),
# ⋮
]

然后在视图中,我们查看category_slug是否设置,如果没有设置,我们查找?name=…查询字符串部分:

def problemlist(request, category_slug=None):
ifcategory_slug is not None:
qs = DataModel.objects.get(category_slug=category_slug)
else:
DataModel.objects.filter(title__icontains=request.GET.get('name'))
return render(request,'list.html', {'qs':qs})

类基视图(CBV)

您还可以使用基于类的视图,在这种情况下,您可以定义ListView的子类:

from django.views.generic import ListView
classProblemListView(ListView):
model = DataModel
template_name = 'list.html'
context_object_name = 'qs'

defget_queryset(self):
if 'category_slug' in self.kwargs:
return super().get_queryset().filter(
category_slug=self.kwargs['category_slug']
)
else:
return super().get_queryset().filter(
title__icontains=request.GET.get('name')
)

,然后我们再次创建两个路径来调用相同的视图:

urlpatterns = [
# ⋮,
path('datalist/search/',views.ProblemListView.as_view(), name='problem_list_search'),
path('datalist/<slug:category_slug>/',views.ProblemListView.as_view(), name='problem_list_category'),
# ⋮
]

最新更新