在Django中创建一个包含数百个复选框的表单,而不会达到IE8中的URL长度限制
我有一个表单,它需要有数百个复选框,但是如果用户选择了所有复选框,那么生成的URL会很长,IE8会将其截断为大约2000个字符 当前的实现创建如下URL:在Django中创建一个包含数百个复选框的表单,而不会达到IE8中的URL长度限制,django,url,internet-explorer-8,django-forms,Django,Url,Internet Explorer 8,Django Forms,我有一个表单,它需要有数百个复选框,但是如果用户选择了所有复选框,那么生成的URL会很长,IE8会将其截断为大约2000个字符 当前的实现创建如下URL: http://example.com?c_$id1=on&c_$id2=on&c$id3=on...etc. 基本上,每个复选框都有一个ID,该ID作为参数发送到URL 我想将URL改为如下,使用管道分隔值: http://example.com?c=$id1|$id2|$id3|$id4...etc. 在客户端,这很容易
http://example.com?c_$id1=on&c_$id2=on&c$id3=on...etc.
基本上,每个复选框都有一个ID,该ID作为参数发送到URL
我想将URL改为如下,使用管道分隔值:
http://example.com?c=$id1|$id2|$id3|$id4...etc.
在客户端,这很容易,因为我已经用JavaScript提交了表单,但在服务器端,我希望避免在Django表单中做太多疯狂的工作,目前Django表单将这些复选框构造为几百个布尔字段
在Django表单中反转管道分隔值以使其顺利工作的最佳方法是什么
其他几点注意事项:
我昨天发布后找到了一个解决方案。这有点蹩脚,但从用户的角度来看,一切似乎都很好
c=forms.CharField(必需=False,widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
super(SearchForm, self).__init__(*args, **kwargs)
COURTS = Court.objects.filter(in_use=True).values_list('courtUUID', 'short_name')
for court in COURTS:
self.fields['court_' + court[0]] = forms.BooleanField(
label=court[1],
required=False,
initial=True,
widget=forms.CheckboxInput(attrs={'checked': 'checked'})
)
c
字段的值转换回clean方法中的复选框,将两者结合在一起:
def clean(self):
# Convert the value in the court field to the various court_* fields
court_str = cleaned_data.get('c')
if court_str:
court_ids = court_str.split(' ') # Using a pipe here will suck on IE and Chrome (but not FF)
for id in court_ids:
cleaned_data['court_%s' % id] = True
c
)我最讨厌的是,我把Django表单砍掉了,这对他们来说有点不公平。很高兴听到更好的解决方案。您考虑过重定向吗?行不通:您必须在某个时候将用户发送到太长的URL,IE8会将其截断。好的,这是常规重定向,但您可以在服务器端执行URL反向,而客户端不会注意到……啊。那么,将用户发送到管道分隔的URL,然后服务器端将该URL重定向到复选框版本?看起来有点像黑客,不是吗?你可以看看: