如何使用RadioSelect字段创建Django表单,并禁用某些按钮?
发布时间:2020-12-20 11:20:03 所属栏目:Python 来源:网络整理
导读:我正在创建一个带有一组Radio按钮的Django表单(作为单个RadioSelect字段),我想让一些按钮变灰.但是,鉴于RadioSelect字段是表单上的单个字段,我还没有找到方法. class OrderStatusForm(forms.Form): os = Order_Status.objects.values_list('id','status') st
我正在创建一个带有一组Radio按钮的Django表单(作为单个RadioSelect字段),我想让一些按钮变灰.但是,鉴于RadioSelect字段是表单上的单个字段,我还没有找到方法.
class OrderStatusForm(forms.Form): os = Order_Status.objects.values_list('id','status') status = forms.ChoiceField(choices=os,widget=forms.RadioSelect()) def makeForm(): newForm = OrderStatusForm() # next line disables all radio buttons. newForm.fields['status'].widget.attrs['disabled'] = True 有没有办法有选择地禁用单个单选按钮?或者我只是不必首先将禁用的选项放在列表中? 解决方法
进一步的研究发现了一个事实,即RadioSelect渲染器可以被替换,并作为参数传递给初始的widget创建函数.所以我创建了自己的渲染器,并附上了一个布尔列表,指出应该禁用哪些单选按钮.
渲染器根据需要向每个单选按钮窗口小部件添加禁用属性,然后force_unicode将窗口小部件的属性转换为包含disabled =“True”值的HTML. from django.utils.safestring import mark_safe from django.utils.encoding import force_unicode class RandomRenderer(forms.RadioSelect.renderer): """ Modifies some of the Radio buttons to be disabled in HTML,based on an externally-appended Actives list. """ def render(self): if not hasattr(self,"actives"): # oops,forgot to add an Actives list return self.original_render() return self.my_render() def original_render(self): return mark_safe(u'<ul>n%sn</ul>' % u'n'.join([u'<li>%s</li>' % force_unicode(w) for w in self])) def my_render(self): midList = [] for x,wid in enumerate(self): if self.actives[x] == False: wid.attrs['disabled'] = True midList.append(u'<li>%s</li>' % force_unicode(wid)) finalList = mark_safe(u'<ul>n%sn</ul>' % u'n'.join([u'<li>%s</li>' % w for w in midList])) return finalList class OrderStatusForm(forms.Form): os = Order_Status.objects.values_list('id','status','reason') activeList = [True,False,True,] newStatus = forms.ChoiceField(widget=forms.RadioSelect( renderer=RandomRenderer),choices=os) newStatus.widget.renderer.actives = activeList 这有点笨拙 – 我只是将活动列表直接粘贴到渲染器上,它可以工作(喜欢Python的鸭子打字),但如果我在一些构造函数中传递列表会更清晰.不幸的是我遇到了问题,所以采取了简单的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |