在 Class 个基于 ListView 中搜索 |姜戈
Search in Class Based ListView | Django
我正在尝试在 cbv 中搜索项目。虽然用 function based views
太容易了,但我不知道如何在 CBV 中使用它。
我这样试过
views.py
class HomeView(ListView):
model = Item
#query = request.GET.get("q")
def get_context_data(self, **kwargs):
context = super(HomeView, self).get_context_data(**kwargs)
query = self.request.GET.get('q')
if query:
context['model'] = Item.objects.get(title=query)
print(query)
return context
paginate_by = 5
template_name = "home.html"
home.html
<form class="form-inline my-2 my-lg-0" method="GET" action="">
<input class="form-control mr-sm-2" type="text" name="q" placeholder="Search" value="{{ request.GET.q }}">
</form>
问题是它显示了所有项目(不是专门搜索的项目)。
例子:
在 url http://127.0.0.1:8000/?q=Blue
中,它不仅显示标题为 Blue
的项目,还显示所有项目。
您覆盖 .get_queryset(…)
method [Django-doc] 以过滤对象:
class HomeView(ListView):
model = Item
paginate_by = 5
template_name = 'home.html'
def <b>get_queryset</b>(self, *args, **kwargs):
qs = super().get_queryset(*args, **kwargs)
query = self.request.GET.get('q')
if query:
return qs.filter(title=query)
return qs
此查询集也将被分页。所以这意味着在这种情况下,它将显示前五个匹配项。
我正在尝试在 cbv 中搜索项目。虽然用 function based views
太容易了,但我不知道如何在 CBV 中使用它。
我这样试过
views.py
class HomeView(ListView):
model = Item
#query = request.GET.get("q")
def get_context_data(self, **kwargs):
context = super(HomeView, self).get_context_data(**kwargs)
query = self.request.GET.get('q')
if query:
context['model'] = Item.objects.get(title=query)
print(query)
return context
paginate_by = 5
template_name = "home.html"
home.html
<form class="form-inline my-2 my-lg-0" method="GET" action="">
<input class="form-control mr-sm-2" type="text" name="q" placeholder="Search" value="{{ request.GET.q }}">
</form>
问题是它显示了所有项目(不是专门搜索的项目)。
例子:
在 url http://127.0.0.1:8000/?q=Blue
中,它不仅显示标题为 Blue
的项目,还显示所有项目。
您覆盖 .get_queryset(…)
method [Django-doc] 以过滤对象:
class HomeView(ListView):
model = Item
paginate_by = 5
template_name = 'home.html'
def <b>get_queryset</b>(self, *args, **kwargs):
qs = super().get_queryset(*args, **kwargs)
query = self.request.GET.get('q')
if query:
return qs.filter(title=query)
return qs
此查询集也将被分页。所以这意味着在这种情况下,它将显示前五个匹配项。