3

我想采用一个现成的形式(即从django.Forms.form经过验证的绑定数据派生的类的对象)并对其进行 urlencode,就好像它是使用 GET 提交的一样。有内置的方法吗?

为了说明我为什么要问这个问题,以及为什么我不能只打电话urlencode,这个的输出应该是“ box=on”。

from django import forms
from urllib import urlencode


class DemoForm(forms.Form):
    box = forms.BooleanField(required=False)

instance = DemoForm({"box": True})  # it's irrelevant how this data is supplied
instance.is_valid()
print "encoded:", urlencode(instance.cleaned_data)

实际上它是“ box=True”,因为urlencode它没有对格式进行编码,而是对已清理的值进行编码(相信我,BooleanField这是最简单的情况)。

所以我要求一种方法来对表单进行编码,就好像它是一个 GET 字符串一样。正确的 GET 字符串。

4

2 回答 2

4

在表单的 clean_data 上调用 urllib 的 urlencode 在以下两种情况下效果不佳:

  • 如果您使用的是 ModelChoiceField,cleaned_data 将包含实际对象,而不是 ID。这些将 urlencode() 到它们的字符串表示而不是它们的主键。
  • 如果您使用的字段可以包含多个值(例如 MultiValueField、MultipleChoiceField 或其他),则 urlencode() 将丢失该字段中除一个值之外的所有值。所以 {'mykey':[1,2,3]} 变成 ?mykey=3 而不是 ?mykey=1&mykey=2&mykey=3 django 的方式。

要处理这两个问题,请使用表单的内置 urlencode 函数:

form = MyForm(request.POST) #or a dict or whatever
form.is_valid()
querystring = form.data.urlencode() 

请注意,这是在数据上调用的,而不是在 clean_data 上调用的。如果您的表单更改值作为验证的一部分,这些更改将不会在此处反映。

于 2013-12-12T05:54:22.247 回答
2

我不完全确定您对现成表单的含义,因为表单通常没有关联的值。还是您的意思是填写用户填写的表格并将其发布为获取?

您可以使用 urllibs 编码来创建一个 get-string:

import urllib

print urllib.urlencode({'key1': 'value1', 'key2': 'value2'})
# key1=value1&key2=value2

如果您想获取已发布的表单并从此数据创建 GET 字符串:

form = MyForm(request.POST)
if form.is_valid():
    print urllib.urlencode(form.cleaned_data)
    # name=value&name=value etc

如果要为未绑定的表单创建 GET:

# this form contains intitial values
# which are shown when printing the form
form = MyForm()
print urllib.urlencode(form.initial)
# name=value&name=value etc
于 2013-01-14T20:29:17.533 回答