在 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

此查询集也将被分页。所以这意味着在这种情况下,它将显示前五个匹配项。