カスタムウィジェットを作成しました。 、、などにいくつかのクラスを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
のウィジェットとして使用した場合も同じことが起こります。alert1
alert2
編集:
デバッグ中、私はそれを見ることができ、私が最初に提出したときに存在していませんalert1
。alert2
request.POST
ごめんなさい、間違えました。alert1
とalert2
に存在しますが、チェックされ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>