0

何百ものチェック ボックスが必要なフォームがありますが、ユーザーがそれらすべてを選択すると、結果の 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 フォームでクレイジーな作業を行いすぎないようにしたいと考えていますBooleanFields

Djangoフォームでパイプ区切りの値を逆にしてスムーズに動作させる最良の方法は何ですか?

その他の注意事項:

  1. パラメータをこれ以上短くすることはできません。
  2. 投稿リクエストを送信するだけではいけません。URL をブックマーク可能にする必要があります。
  3. IE8 ユーザーを取り除くことはできません...まだ。
4

1 に答える 1

0

投稿後、昨日解決策を見つけました。やや不自由ですが、ユーザーの観点からは、すべてがうまく機能しているように見えます。

  1. c のフォームにフィールドを追加し、非表示のウィジェットを持つように設定します。

    c = forms.CharField(required=False, widget=forms.HiddenInput())

  2. ループと 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'})
            )
    
  3. cclean メソッドでフィールドの値をチェックボックスに戻すことで、この 2 つをまとめます。

    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
    
  4. テンプレートでユーザーにチェックボックスを表示しますが、JavaScript を使用cして GET パラメータの非表示フィールド ( ) に入力します。

このソリューションはライブ サイトで機能しているようで、ユーザーが JavaScript を有効にしていない場合や古い URL を使用している場合でも機能するという優れた利点があります (古いチェックボックスは引き続き機能します)。

これについて私が嫌いな部分は、私が Django フォームからハッキングしていることです。これは、彼らにとって少し不当なことです。しかし、より良い解決策を聞いてうれしいです。

于 2013-10-23T16:00:51.320 に答える