gpt4 book ai didi

python - 自定义小部件仅在第一次时不验证

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:51 24 4
gpt4 key购买 nike

我创建了一个自定义小部件 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))

我在两个不同字段的表单中使用此小部件:

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 .


编辑:

调试时,我可以看到 alert1alert2不在 request.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>

最佳答案

我将您的代码复制并粘贴到一个快速的 Django 应用程序中。对我来说工作得很好。还有其他地方可能出错吗? OS X 上的 Django 1.4。

View .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))

关于python - 自定义小部件仅在第一次时不验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14084380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com