如何为 Django 生成动态搜索表单

How to generate a dynamic search form for Django?

本文关键字:动态 搜索 搜索表 表单 Django      更新时间:2023-09-26

我基于 Django 的 ORM 编写了一个 REST API。以下是我的 REST API 的一些示例

curl "http://example.com/api/pcserver?last_update__lt=2012-06-01 00:00:00&hostname__startswith=xen"

在服务器端,我使用 queryset.filter() 函数来处理所有GET参数,并将结果queryset转换为json,然后返回给用户。

现在我在将此 API 转换为基于 Web 的搜索表单时遇到问题。

我想了解这个神奇的搜索表单:

    使用
  1. JavaScript 动态添加/删除查询参数,使用 AND 连接它们(我不需要在这些参数之间OR
  2. 提供下拉菜单,根据模型选择要搜索的字段
  3. 支持选择运算符,例如 __lt__gt__regex

那里有没有轮子,所以我不必重新发明它?谢谢:-)

@yegle

我建议使用这种媒体类型:http://code.ge/media-types/collection-next-json/它是:http://amundsen.com/media-types/collection/format/媒体类型的扩展,您可以毫无问题地实现目标。

请看这个文档:

{"collection": {
  "version": 1.0,
  "queries": [
    {
      "href":    "http://service.com/my-resource", 
      "rel":     "search", 
      "prompt":  "Enter search string", 
      "data" : [
        {
          "name": "query",
          "prompt": "Search query",
          "required": true
        }, {
          "name":   "gender",
          "prompt": "Gender",
          "list":   {
            "default": "female",
            "options": [
              {"value": "female", "prompt": "Female"},
              {"value": "male",   "prompt": "Male"}
            ]
          }
        }
      ]
    }
  ]  
}}

使用"查询"数组,您可以描述几个搜索模板,这些模板可以轻松地转换为HTML表单。在每个查询对象中,您可以定义:

  • 搜索 URI
  • 「表格」的標題(即提示);及
  • 具有不同要求的任意数量的查询参数。

从上面的例子中看到,有两个查询参数 - "query"和"gender",其中"query"参数可以转换为HTML.input,"gender"参数可以转换为HTML.select。

我希望我正确理解了你的问题和目标。

我不确定 django 工具。但是,您可以使用 MYSQL 的全文布尔搜索来实现上述大部分要求。请参考以下链接并回复您的评论!

http://dev.mysql.com/doc/refman//5.5/en/fulltext-boolean.html

看看 django-filter

或者,以某种黑客方式,使用Django Admin。您可以自定义目标模型的ModelAdmin,并使用ChangeList来处理查询字符串。以内置User为例:

from django.contrib.admin.options.IncorrectLookupParameters
from django.contrib.admin.views.main import ChangeList
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
self = UserAdmin(User, None) # or taken from admin.site._registry if the model admin is registered
cl = ChangeList(request, User, self.list_display,
             self.list_display_links, self.list_filter, self.date_hierarchy,
             self.search_fields, self.list_select_related,
             self.list_per_page, self.list_max_show_all, self.list_editable,
             self)
# then cl.get_query_set would process querystring and generate the queryset
try:
    cl.get_query_set(request)
except IncorrectLookupParameters:
    'encounter an invalid lookup'