進一步的研究表明,RadioSelect renderer
可以將替換爲,並作爲參數傳入初始窗口小部件創建函數。所以我創建了我自己的渲染器,並附加了一個布爾值列表,指出哪些單選按鈕應該被禁用。
渲染器增加了一個禁用屬性根據需要每個單選按鈕插件,則force_unicode轉動部件的屬性成HTML,包括一個disabled="True"
值。
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%s\n</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%s\n</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, False, True, False,]
newStatus = forms.ChoiceField(widget=forms.RadioSelect(
renderer=RandomRenderer), choices=os)
newStatus.widget.renderer.actives = activeList
這是一個小缺憾 - 我只是直接粘在活性名單上的渲染,其工作(愛Python的鴨打字),但如果我通過在一些構造函數列表會更乾淨。不幸的是我遇到了問題,所以採取了簡單的方法。 :)
這與我發佈的內容沒有什麼不同 - 'status'被認爲是一個*單個字段*(帶有多個單選按鈕),整個事物都被禁用。只是將代碼移動到* init *並不會改變它的影響。 –