python – 自定义小部件仅在第一次不验证
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 自定义小部件仅在第一次不验证,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5061字,纯文字阅读大概需要8分钟。
内容图文
![python – 自定义小部件仅在第一次不验证](/upload/InfoBanner/zyjiaocheng/770/454cc653349a4805a561adf6d57e93c4.jpg)
我已经创建了一个自定义小部件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的小部件,也会发生同样的事情.
编辑:
在调试时,我可以看到alert1和alert2在我第一次提交时没有出现在request.POST上.
对不起,我搞错了. alert1和alert2出现在request.POST上,但是尽管被勾选,它们都是你的.
编辑2:
使用Chrome的“Inspect元素”,我可以看到第一次正确渲染表单:
<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.
views.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 – 自定义小部件仅在第一次不验证全部内容,希望文章能够帮你解决python – 自定义小部件仅在第一次不验证所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。