我试图在我的Django应用程序中构建功能,我们可以通过两种方法获得数据:
使用搜索- 选择类别
因为它们都需要从数据集获取数据,我想知道是否有一种方法可以利用相同的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'),
# ⋮
]