ChoiceFieldRenderer已删除。解决办法是什么?

时间:2017-10-01 23:19:07

标签: python django

似乎很少有人使用它,但是......我做到了。 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.

好。怎么样?

1 个答案:

答案 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.formsINSTALLED_APPS