加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何使用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的鸭子打字),但如果我在一些构造函数中传递列表会更清晰.不幸的是我遇到了问题,所以采取了简单的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读