【问题标题】:Difficulty converting request.POST value in Django在 Django 中难以转换 request.POST 值
【发布时间】:2017-10-20 17:16:39
【问题描述】:

在我的 Django 应用程序中,我有一个 POST 请求 QueryDict,我正在尝试更改其值。我知道 QueryDict 对象是不可变的,所以我实例化了一个可变的 QueryDict 项。问题的症结在于该值是来自应用程序前端的 AJAX 调用的逗号分隔数字的字节字符串,例如U"2,4,6,7"。

QueryDict 中的每个键值本质上是一个值列表,[U'2', U'4'] 所以我需要更改从我的前端发布的单字节 U"2,4,6,7"进入字节字符串列表 [U'2', U'4', U'6', '7']。然而,问题是每当我尝试对字符串进行拆分并将请求 POST 键值分配给新的拆分字符串时,键值是一个列表,在一个列表中。例如{'专业知识':[[U'2',U'4']]}。我尝试了一个人为的解决方案,通过迭代值的拆分列表,并将它们附加到请求 POST 项的键值中,但它给了我错误

AttributeError: 'unicode' object has no attribute 'append'

在可变 QueryDict 对象中,如果每个 QueryDict 项目都是一个列表,并且它没有附加值,那么如何编辑列表项目?有没有更简单的方法来完成这个?

查看功能代码

mentors = Mentor.objects.filter(is_active=True, is_verified=True).order_by('last_name', 'first_name')

ajax_post = dict(request.POST.iteritems())

post = QueryDict('', mutable=True)
post.update(ajax_post)

for key in post:
    postlist = post[key].split(',')

    for item in postlist:
        post[key].append(item)

# First attempt that gives list in a list

# for item in post:
#    post[key] = post[key].split(',')

form = MentorSearchForm(data=post)

if form.is_valid():
    mentors = filter_mentors(form.cleaned_data)

【问题讨论】:

  • 您应该解释为什么要修改 querydict,而不是编写表单验证以便它接受发布的内容。
  • (而且 Python 列表也没有名为 push 的方法;也许您的意思是 append?)
  • 是的,我的意思是追加。抱歉,我一直在从 python 到 javascript 来回切换,有时会互换这些术语。

标签: django dictionary post request


【解决方案1】:

你被QueryDict.__setitem__ 发现了。当您执行querydict['key'] = value 时,它会将密钥设置为[value],而不是value

您可以使用QueryDict.setlist 方法将给定键设置为给定列表。

querydict = QueryDict('', mutable=True)

for key in request.POST.iteritems():
    postlist = post[key].split(',')
    querydict.setlist(key, postlist)

由于您要遍历发布数据中的每个键,我认为您可以从代码中删除 update() 步骤。

【讨论】:

    【解决方案2】:

    如果我正确理解了约束,您应该使用builtin array type

    >>> q =  U"2,4,6,7"
    >>> import array
    >>> ary = array.array('u', q)
    >>> [i for i in ary if i.isdigit()]
    [u'2', u'4', u'6', u'7']
    

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多