【问题标题】:Extracting array with indices from GET parameters in Django从Django中的GET参数中提取带有索引的数组
【发布时间】:2020-02-06 07:15:24
【问题描述】:

我的 Django 项目有一个页面,其中包含一个由 DataTables 提供支持的表。在这种情况下,该表使用 Django 视图和 GET http 方法进行服务器端处理。 Django 视图将查询字符串解包到一个 QueryDict 对象中,我的任务是从这个 QueryDict 中为表的每一列解包 DataTables 参数。请注意,我必须使用 GET,而不是 POST,因为我想将 POST 方法用于实际更改服务器上数据的其他事情。

DataTables 为表中的每一列提交与搜索字符串和每列排序相关的数据。此数据是根据他们的文档here 提交的;要点是柱状参数在查询字符串中发送,如下所示:

...&column[5][search][value]=searchme&column[6][search][value]=more&...

我希望以这样的方式解包,以使生成的数据结构看起来像这样:

column = [
    {
        'search': {
            'value': 'searchme'
        }
    },
    ...

]

...将数组的元素按照索引指定的顺序提交到查询字符串中。

有没有使用 Django 的 QueryDict 完成此任务的标准方法?

【问题讨论】:

标签: python django datatables get query-string


【解决方案1】:

来源: https://gist.github.com/ijharulislam/28e9743e68a165dff0e4d1669644c4ba

def get_html_array(query_dict, param):
    dictionary = {}
    regex = re.compile('%s\[([\w\d_]+)\]' % param)
    for key, value in query_dict.items():
        match = regex.match(key)
        if match:
            inner_key = match.group(1)
            regex_sec = re.compile('%s\[%s\]\[([\w\d_]+)\]' % (param, inner_key))
            match_second = regex_sec.match(key)
            if match_second:
                dictionary[inner_key] = get_html_array(query_dict, '%s\[%s\]' % (param, inner_key))
            else:
                dictionary[inner_key] = value

    return dictionary

如何使用:

 <form method="post">
   <input type='text' name='search[1][field]'>
   <input type='text' name='search[1][value]'>
   <input type='text' name='search[2][field]'>
   <input type='text' name='search[2][value]'>
   ...
 </form>
searchFields = get_html_array(request.POST, 'search')

你会得到:

{
  "1": {
    "field": "...",
    "value": "..."
  },
  "2": {
    "field": "...",
    "value": "..."
  }
}

玩得开心。

【讨论】:

    【解决方案2】:

    看起来 Django 没有实现这一点。在这一点上,看起来我唯一的选择是:

    1. 使用库(如 Satendra 在他们对该问题的评论中建议的),或
    2. 编写一个自定义解析器,该解析器可以处理原始查询字符串或 Django 基于类的视图中已经可用的 QueryDict 对象,或者
    3. 更改发送到 Django 视图的数据,使其不是多维的。

    在这种情况下,我选择了第三个选项;我正在修改 DataTables 发送到服务器的数据,以便它可以直接传递给未修改的 FilterSet 或 Form 类构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-22
      • 2022-01-23
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 2022-08-04
      相关资源
      最近更新 更多