【问题标题】:Django equivalent of PHP's form value array/associative arrayDjango 等价于 PHP 的表单值数组/关联数组
【发布时间】:2010-10-22 12:41:53
【问题描述】:

在 PHP 中,我会这样做以将 name 作为一个数组。

<input type"text" name="name[]" />
<input type"text" name="name[]" />

或者,如果我想将 name 作为关联数组:

<input type"text" name="name[first]" />
<input type"text" name="name[last]" />

Django 等价物是什么?

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    Check out the QueryDict documentation,特别是QueryDict.getlist(key)的用法。

    由于视图中的 request.POST 和 request.GET 是 QueryDict 的实例,您可以这样做:

    <form action='/my/path/' method='POST'>
    <input type='text' name='hi' value='heya1'>
    <input type='text' name='hi' value='heya2'>
    <input type='submit' value='Go'>
    </form>
    

    然后是这样的:

    def mypath(request):
        if request.method == 'POST':
            greetings = request.POST.getlist('hi') # will be ['heya1','heya2']
    

    【讨论】:

    • 当密钥很重要时会失败。例如 name="question[4]" 其中 4 是问题 ID。
    【解决方案2】:

    很抱歉挖掘了这个,但 Django 有一个 utils.datastructures.DotExpandedDict。这是它的文档的一部分:

    >>> d = DotExpandedDict({'person.1.firstname': ['Simon'], \
            'person.1.lastname': ['Willison'], \
            'person.2.firstname': ['Adrian'], \
            'person.2.lastname': ['Holovaty']})
    >>> d
    {'person': {'1': {'lastname': ['Willison'], 'firstname': ['Simon']}, '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}}
    

    唯一的区别是您使用点而不是括号。

    编辑:此机制已被表单前缀取代,但如果您仍想使用此概念,可以将旧代码放入您的应用程序中: https://gist.github.com/grzes/73142ed99dc8ad6ac4fc9fb9f4e87d60

    【讨论】:

    • 这是我找到的最佳解决方案。谢谢。
    • 我在 Django 应用程序中依赖 DotExpandedDict,它比 QueryDict.getlist 有用得多。不幸的是,它已从 Django(至少是开发版本)中删除。不过,您仍然可以grab the source code for it
    • DotExpandedDict 自 django 1.5 起被删除
    • 自从 DotExpandedDict 被删除后,有什么好的替代方法吗?
    • 是的,有什么想法吗? django 团队似乎在这里做得不太好
    【解决方案3】:

    Django 没有提供从请求对象获取关联数组(Python 中的字典)的方法。正如第一个答案指出的那样,您可以根据需要使用.getlist(),或者编写一个可以采用QueryDict 并根据自己的喜好重新组织它的函数(如果键与某些key[*] 模式匹配,则取出键/值对,例如)。

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 1970-01-01
      • 2021-03-26
      • 2019-05-12
      • 1970-01-01
      • 2012-09-29
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多