我可以将Django表单转换为GET请求字符串吗?

时间:2013-01-14 18:32:04

标签: django django-forms

我想采用现成的形式(即从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字符串。

2 个答案:

答案 0 :(得分:4)

在表单的cleaning_data上调用urllib的urlencode在两种情况下不能正常工作:

  • 如果您使用的是ModelChoiceField,则cleaning_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() 

请注意,这是在数据上调用的,而不是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