Django - 列表视图中的搜索栏 |如何定义和处理它

Django - Searchbar in Listview | How to define and process it

我对 django 和 python 完全陌生。 我想在我的 Listview 页面上添加一个搜索栏,正如我在 Django 管理站点上看到的那样。

我在网上看过很多 django 文档、很多解释和很多教程,但我不得不说我很困惑,找不到解决我问题的方法。 我想做的事: 我有一个带有(class-based)ListView 的页面,它显示了我的 table 中的 5 个字段。 正如我在 Django 管理站点上看到的那样,我想添加一个搜索栏来处理这 5 个字段中的 2 个(对象 ID 和描述)。

查看文档和网络,有很多不同的建议可以做到这一点(查询集、过滤器、上下文、Q...)。就我个人而言,我想根据上下文进行工作。我试图从我的搜索栏中恢复信息,但我已经实施和尝试的内容从现在开始不起作用。 有人可以帮我解决这个问题吗?最佳实践和方法是什么?关于如何用一些代码示例来管理这个的指示? 提前致谢!

#HTML

<form method="GET">
  <input type="text" name="q" value="" id="searchbar" autofocus>
  <input class="button" type="submit" value="Search">
</form>

#查看 class AircraftListView(列表视图):

model = Aircraft
paginate_by = 10

def get_context_data(self, **kwargs):
    context = super(AircraftListView, self).get_context_data(**kwargs)
    print(context)
    filter_set = Aircraft.objects.all()
    if self.request.GET.get('searchbar'):
        q = self.request.GET.get('searchbar')
        print('Hello I am on the right way')
        filter_set = filter_set.filter(q=self.aircraft.air_tailnumber)
    else:
        print('I took the wrong way')
        

    return context

既然你不想用django filter,我就尽量举个例子给你看。与其覆盖实际上用于额外上下文的 get_context_data,不如覆盖 ListView 中的 get_queryset 方法。类似于:

def get_queryset(self):
    queryset = super().get_queryset()
    search_text = request.GET.get("searchbar")
    if search_text:
        return queryset.filter(your_model_field=search_text)
    return queryset