4

カスタムウィジェットを作成しました。 、、などにいくつかのクラスをOrderedCheckboxSelectMultiple置き換え<ul>て追加しています。<ol><label><li>

class OrderedCheckboxSelectMultiple(forms.CheckboxSelectMultiple):

    def render(self, name, value, attrs=None, choices=()):
        if value is None: value = []
        has_id = attrs and 'id' in attrs
        final_attrs = self.build_attrs(attrs, name=name)
        output = [u'<ol class="numeric">']
        # Normalize to strings
        str_values = set([force_unicode(v) for v in value])
        for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
            # If an ID attribute was given, add a numeric index as a suffix,
            # so that the checkboxes don't all have the same ID attribute.
            if has_id:
                final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
                label_for = u' for="%s"' % final_attrs['id']
            else:
                label_for = ''

            cb = forms.CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
            option_value = force_unicode(option_value)
            rendered_cb = cb.render(name, option_value)
            option_label = conditional_escape(force_unicode(option_label))
            output.append(u'<li class="liAll"><label%s class="checkbox inline">%s <span class="spanLabel">%s</span></label></li>' % (
                label_for, rendered_cb, option_label))
        output.append(u'</ol>')
        return mark_safe(u'\n'.join(output))

私はこのウィジェットを2つの異なるフィールドのフォームで使用しています。

class SomeForm(forms.Form):
    # more fields here

    alert1 = forms.MultipleChoiceField(choices=[(a.id, a.description) for a in SomeModel.objects.filter(a=True)],
                                             widget=OrderedCheckboxSelectMultiple())
    alert2 = forms.MultipleChoiceField(choices=[(a.id, a.description) for a in SomeModel.objects.filter(b=True)],
                                             widget=OrderedCheckboxSelectMultiple())

問題は、フォームを初めて送信すると、検証エラーが発生することです。

Select a valid choice. is not one of the available choices.

次に、もう一度選択肢にチェックマークを付けると、問題なく検証されます。私はここで迷子になっています。助言がありますか?

ノート:

forms.CheckboxSelectMultipleのウィジェットとして使用した場合も同じことが起こります。alert1alert2


編集:

デバッグ中、私はそれを見ることができ、私が最初に提出したときに存在していませんalert1alert2request.POST

ごめんなさい、間違えました。alert1alert2に存在しますが、チェックされrequest.POSTているにもかかわらず、両方とも存在します。u''


編集2:

Chromeの「要素の検査」を使用すると、フォームが最初に正しくレンダリングされていることがわかります。

<ol class="numeric">
    <li class="liAll">
        <label for="id_alert1_0" class="checkbox inline">
            <div class="checker" id="uniform-id_alert1_0">
                <span>
                    <input value="1" type="checkbox" class="check" name="alert1" id="id_alert1_0" style="opacity: 0;">
                </span>
            </div>
        </label>
    </li>
    <li class="liAll">
        <label for="id_alert1_1" class="checkbox inline">
            <div class="checker" id="uniform-id_alert1_1">
                <span>
                    <input id="id_alert1_1" type="checkbox" class="check" value="2" name="alert1" style="opacity: 0;">
                </span>
            </div>
        </label>
    </li>
</ol>

次に、検証メッセージが再度表示されますが、レンダリングされたフォームは同じように見えます。

<ol class="numeric">
    <li class="liAll">
        <label for="id_alert1_0" class="checkbox inline">
            <div class="checker" id="uniform-id_alert1_0">
                <span>
                    <input value="1" type="checkbox" class="check" name="alert1" id="id_alert1_0" style="opacity: 0;">
                </span>
            </div>
        </label>
    </li>
    <li class="liAll">
        <label for="id_alert1_1" class="checkbox inline">
            <div class="checker" id="uniform-id_alert1_1">
                <span>
                    <input id="id_alert1_1" type="checkbox" class="check" value="2" name="alert1" style="opacity: 0;">
                </span>
            </div>
        </label>
    </li>
</ol>

送信ボタンを使用して投稿を送信しています。

<button type="submit" class="btn btn-primary">Send</button>
4

1 に答える 1

1

コードをコピーして、簡単な django アプリに貼り付けました。私にとってはうまくいきました。エラーが発生する可能性のある他の場所はありますか?OS x 上の Django 1.4。

ビュー.py

class OrderedCheckboxSelectMultiple(CheckboxSelectMultiple):
    def render(self, name, value, attrs=None, choices=()):
        if value is None: value = []
        has_id = attrs and 'id' in attrs
        final_attrs = self.build_attrs(attrs, name=name)
        output = [u'<ol class="numeric">']
        # Normalize to strings
        str_values = set([force_unicode(v) for v in value])
        for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
            # If an ID attribute was given, add a numeric index as a suffix,
            # so that the checkboxes don't all have the same ID attribute.
            if has_id:
                final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
                label_for = u' for="%s"' % final_attrs['id']
            else:
                label_for = ''

            cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
            option_value = force_unicode(option_value)
            rendered_cb = cb.render(name, option_value)
            option_label = conditional_escape(force_unicode(option_label))
            output.append(u'<li class="liAll"><label%s class="checkbox inline">%s <span class="spanLabel">%s</span></label></li>' % (
            label_for, rendered_cb, option_label))
            output.append(u'</ol>')
        return mark_safe(u'\n'.join(output))

class SomeForm(forms.Form):
    alert1 = MultipleChoiceField(choices=[(a.id, a.name) for a in Widget.objects.filter(a=False)],
                                         widget=OrderedCheckboxSelectMultiple())
    alert2 = MultipleChoiceField(choices=[(a.id, a.name) for a in Widget.objects.filter(a=False)],
                                         widget=OrderedCheckboxSelectMultiple())

def index(request):
    if request.method =="POST":
        form = SomeForm(request.POST)
        print(request.POST.keys())
        if form.is_valid():
            print("trying to save")
    else:
        form = SomeForm()
    return render_to_response('publichome.html', locals(), context_instance=RequestContext(request))
于 2013-01-05T19:22:54.887 に答える