【发布时间】:2014-11-27 15:25:57
【问题描述】:
我正在创建一个 Django 应用程序并尝试在 Django Web 管理界面中为特定模型包含更多搜索框,以便用户可以同时搜索更多字段。例如,用户可以在一个搜索框中输入城市名称,在另一个搜索框中输入街道名称,点击“搜索”按钮后,所有具有对应城市和街道的模型实例都会显示在浏览器中。默认管理网页界面只有一个搜索框。我在change_list.html 文件中添加了三个搜索框,当我在浏览器的这些搜索框中输入一些数据并点击“搜索”时,会形成一个正确的 URL(查询字符串包含搜索应该使用的这三个输入参数做完了)。然后我在queryset 方法中捕获这些输入参数,这些输入参数已在我的扩展models.AdminModel calss 的类中覆盖,执行查询集过滤并最终返回过滤后的查询集。现在,问题是在搜索过程完成后,过滤后的查询集根本没有显示在网页(我的模型的 Web 界面)上,它说没有找到匹配项。但我绝对确定我的过滤查询集包含数据,因为我在执行queryset 方法的return 命令之前在命令行中打印它,并且它打印正确的数据。
这是我的queryset 方法:
def queryset(self, request):
qs = super(UkopcanjeAdmin, self).queryset(request)
if "mjesto" in request.GET:
lokacija = request.GET.get('mjesto',None)
if lokacija:
qs = qs.filter(mjesto__icontains=lokacija)
if "ulica" in request.GET:
ulica = request.GET.get('ulica',None)
if ulica:
qs = qs.filter(ulica__icontains=ulica)
if "naziv" in request.GET:
naziv = request.GET.get('naziv',None)
if naziv:
qs = qs.filter(naziv__icontains=naziv)
print qs #this prints correct filtered data
return qs
为什么过滤后的查询集没有显示在 Web 界面中?
编辑:感谢我的朋友,我终于设法解决了这个问题。解决方案也很简单,我只需将queryset 方法的整个代码移动到get_search_results 方法,然后过滤查询集返回false 布尔参数(因为get_search_results 方法返回两个参数)。所以如果有人想在 Django 中自定义搜索过程,应该使用get_search_results 方法。在那里你可以访问查询字符串参数并以你想要的方式检索一些数据。
【问题讨论】:
标签: python django django-queryset