Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django中创建一个包含数百个复选框的表单,而不会达到IE8中的URL长度限制_Django_Url_Internet Explorer 8_Django Forms - Fatal编程技术网

在Django中创建一个包含数百个复选框的表单,而不会达到IE8中的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. 在客户端,这很容易

我有一个表单,它需要有数百个复选框,但是如果用户选择了所有复选框,那么生成的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.
在客户端,这很容易,因为我已经用JavaScript提交了表单,但在服务器端,我希望避免在Django表单中做太多疯狂的工作,目前Django表单将这些复选框构造为几百个
布尔字段

在Django表单中反转管道分隔值以使其顺利工作的最佳方法是什么

其他几点注意事项:

  • 我无法将参数更改为更短
  • 我不能只是发送一个post请求,我需要的URL是书签
  • 我还不能摆脱IE8用户…现在

  • 我昨天发布后找到了一个解决方案。这有点蹩脚,但从用户的角度来看,一切似乎都很好

  • 在c的表单中添加一个字段,并将其设置为具有隐藏小部件:

    c=forms.CharField(必需=False,widget=forms.HiddenInput())

  • 使用循环和DB查询将数百个复选框添加到表单的init方法中:

    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
    
  • 在模板中,向用户显示复选框,但使用JavaScript填充GET参数中的隐藏字段(
    c

  • 这个解决方案似乎在我们的实时站点上运行,并且具有很好的优势,即使用户没有启用javascript,或者使用旧的URL(旧的复选框仍然有效)


    我最讨厌的是,我把Django表单砍掉了,这对他们来说有点不公平。很高兴听到更好的解决方案。

    您考虑过重定向吗?行不通:您必须在某个时候将用户发送到太长的URL,IE8会将其截断。好的,这是常规重定向,但您可以在服务器端执行URL反向,而客户端不会注意到……啊。那么,将用户发送到管道分隔的URL,然后服务器端将该URL重定向到复选框版本?看起来有点像黑客,不是吗?你可以看看: