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

时间:2012-06-04 09:38:19

标签: javascript django

我写了一个基于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,然后返回给用户。< / p>

现在我无法将此API转换为基于网络的搜索表单。

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

  1. 使用javascript动态添加/删除查询参数,使用AND加入它们(我不需要OR这些参数之间)
  2. 提供下拉菜单,根据型号选择要搜索的字段
  3. 支持选择运营商,例如__lt__gt__regex
  4. 那里有轮子所以我不必重新发明它吗?谢谢: - )

3 个答案:

答案 0 :(得分:1)

@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"}
            ]
          }
        }
      ]
    }
  ]  

}}

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

  • 搜索URI
  • “表格”的标题(即提示);和
  • 具有不同要求的任意数量的查询参数。

正如您从上面的示例中看到的,有两个查询参数 - “查询”和“性别”,其中“查询”参数可以转换为HTML.input,“gender”参数可以转换为HTML.select。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

查看django-filter

或者,以某种黑客方式,使用Django Admin。您可以为目标模型自定义ModelAdmin,并使用ChangeList来处理w / querystring。以内置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'