我想采用现成的形式(即从django.Forms.form
派生的类的对象和经过验证的绑定数据)并对其进行urlencode,就好像它是用GET提交的一样。有内置的方式吗?
为了说明为什么我问这个questino,以及为什么我不能只调用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字符串。
答案 0 :(得分:4)
在表单的cleaning_data上调用urllib的urlencode在两种情况下不能正常工作:
要解决这两个问题,请使用表单的内置urlencode函数:
form = MyForm(request.POST) #or a dict or whatever
form.is_valid()
querystring = form.data.urlencode()
请注意,这是在数据上调用的,而不是cleaning_data。如果您的表单在验证过程中更改了值,则这些更改将不会反映在此处。
答案 1 :(得分:2)
我不完全确定您对现成表单的意思,因为表单通常没有关联的值。或者你的意思是拿一个用户填写的表格并将其发布为get?
您可以使用urllibs encode来创建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