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

我可以将Django表单转换为GET请求字符串吗?,django,django-forms,Django,Django Forms,我想获取一个现成的表单(即从django.Forms.form派生的类的对象,带有经过验证的绑定数据)并对其进行URL编码,就好像它是通过GET提交的一样。有内置的方式吗 为了说明为什么我要问这个问题,以及为什么我不能直接调用urlencode,这个问题的输出应该是“box=on” 事实上,它是“box=True”,因为urlencode不是对表单进行编码,而是对清除的值进行编码(相信我,BooleanField是最简单的情况) 因此,我在寻求一种方法,将表单编码为GET字符串。一个正确的GET

我想获取一个现成的表单(即从
django.Forms.form
派生的类的对象,带有经过验证的绑定数据)并对其进行URL编码,就好像它是通过GET提交的一样。有内置的方式吗

为了说明为什么我要问这个问题,以及为什么我不能直接调用
urlencode
,这个问题的输出应该是“
box=on

事实上,它是“
box=True
”,因为
urlencode
不是对表单进行编码,而是对清除的值进行编码(相信我,
BooleanField
是最简单的情况)


因此,我在寻求一种方法,将表单编码为GET字符串。一个正确的GET字符串。

我不能完全确定您对现成表单的意思,因为表单通常没有关联的值。或者你的意思是采取一个用户填写的表格,并将其作为get发布

您可以使用urllibs encode创建get字符串:

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

在两种情况下,对表单的已清理的_数据调用urllib的urlencode将无法正常工作:

  • 如果您使用的是ModelChoiceField,则清除的_数据将包含实际对象,而不是ID。它们将urlencode()转换为它们的字符串表示形式,而不是它们的主键
  • 如果您使用的字段可以包含多个值(例如MultiValueField、MultipleEchoiceField或其他值),urlencode()将丢失该字段中除一个值以外的所有值。所以{'mykey':[1,2,3]}变成了?mykey=3,而不是像django那样的?mykey=1&mykey=2&mykey=3
要解决这两个问题,请使用表单的内置urlencode函数:

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

请注意,这是在数据上调用的,而不是在数据上调用的。如果您的表单在验证过程中更改了值,那么这些更改将不会反映在这里。

所谓“就绪”是指表单类派生表单的实例
django.Forms.form
。我来澄清这个问题。我知道如何使用我自己的字典构建GET字符串,我想根据字段从一个经过验证的表单中创建它。我担心我有点迷失在表单的“流”中,这应该发生在什么时候,但我已经用更多的示例更新了我的响应。假设我有一个带有绑定数据的经过验证的表单(即,我调用的
是否有效
,响应是否为
)。这是根据数据构造和初始化的。这可以是构造函数中提供的初始数据,也可以是POST数据,也可以是任何数据。无论此表单对象是如何创建的。我想生成一个GET url编码字符串,表示如果我从浏览器提交表单,将如何提交表单。我是afraid form.cleaned_数据包括对象查找等,因此不适合传递到
urlencode
(例如,Python中的复选框为True,但URL应显示“on”)。很抱歉,我认为问题很清楚,我添加了一个示例来说明。这非常有效,谢谢。请注意,如果表单中的数据是通过POST生成的,它可能会有一个csrfmiddlewaretoken,这可能应该去掉。如果现在有人偶然发现了这一点,Django 1.10显然不再支持它从django.utils.http导入urlencode;querystring=urlencode(form.data,doseq=True)将为您完成此操作。
form = MyForm(request.POST) #or a dict or whatever
form.is_valid()
querystring = form.data.urlencode()