似乎很少有人使用它,但是......我做到了。 Here您可以阅读:
删除了django.forms.widgets中的一些未记录的类: SubWidget RendererMixin,ChoiceFieldRenderer,RadioFieldRenderer, CheckboxFieldRenderer ChoiceInput,RadioChoiceInput, CheckboxChoiceInput
我的源代码是:
from django.forms.widgets import ChoiceFieldRenderer, RadioChoiceInput, \
RendererMixin, Select
class BootstrapRadioFieldRenderer(ChoiceFieldRenderer):
outer_html = '<span {id_attr}>{content}</span>'
inner_html = '<div class="radio">{choice_value}{sub_widgets}</div>'
choice_input_class = RadioChoiceInput
class BootstrapRadioSelect(RendererMixin, Select):
renderer = BootstrapRadioFieldRenderer
_empty_value = ''
我真的不知道如何转换它以使其适用于1.11及更高版本:他们说:
Use a custom widget template instead.
好。怎么样?
答案 0 :(得分:0)
我们使用RadioFieldRenderer为每个选项添加说明。您的用例可能远非如此,但我希望它也可以帮助您进行迁移。
这是Django&lt; = 1.10
的遗留代码class MyRadioFieldRenderer(forms.widgets.RadioFieldRenderer):
def render(self):
radios = []
for w in self:
radios.append(u"""<li class="%s">%s <span>%s</span></li>"""
% (w.choice_value, force_unicode(w), get_description(w)))
return mark_safe(u'<ul>\n%s\n</ul>' % u'\n'.join(radios))
class MyRadioSelect(forms.RadioSelect):
renderer = MyRadioFieldRenderer
我用Django 1.11替换它,使用自定义模板片段并仅将描述添加到模板上下文中。
from django.forms.widgets import RadioSelect
class MyRadioSelect(RadioSelect):
template_name = 'myapp/multiple_input.html'
option_template_name = 'myapp/input_option.html'
def get_context(self, name, value, attrs):
context = super(MyRadioSelect, self).get_context(name, value, attrs)
for i in range(len(context['widget']['optgroups'][0][1])):
value = context['widget']['optgroups'][0][1][i]['value']
context['widget']['optgroups'][0][1][i]['attrs']['description'] = \
get_description(value)
return context
这个深层列表中的for循环并不漂亮。需要再看一遍。
在模板片段中,我可以使用<span>{{widget.attrs.description | safe}}</span>
表格保持不变:
class MyForm(forms.Form):
order_method = ChoiceField(
widget=MyRadioSelect,
required=True)
重要提示:要让Django在常规模板文件夹中找到您的自定义模板代码段,请将其添加到您的设置中:
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
和django.forms
到INSTALLED_APPS