【问题标题】:ChoiceFieldRenderer removed. What is the solution?ChoiceFieldRenderer 已删除。解决办法是什么?
【发布时间】:2017-10-01 23:19:06
【问题描述】:

似乎很少有人使用它,但是……我用过。 Here你可以阅读:

django.forms.widgets 中一些未记录的类被删除: SubWidget RendererMixin, ChoiceFieldRenderer, RadioFieldRenderer, CheckboxFieldRenderer ChoiceInput、RadioChoiceInput、 复选框选择输入

我的源代码是:

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.

嗯。怎么样?

【问题讨论】:

  • 从那以后您找到解决方法了吗?
  • Nope:^/ 有时间我得自己找找,不过感觉只有我们一个人用这个方法……
  • 我很快就可以向您展示我在失去RadioFieldRenderer 的情况下的一个版本。但我已经可以分享,不将FORM_RENDERER 设置为django.forms.renderers.TemplatesSetting 是浪费时间。否则它不会像视图那样搜索模板>
  • 热切等待您的答复:)

标签: python django


【解决方案1】:

我们使用 RadioFieldRenderer 为每个选项添加描述。您的用例可能远非如此,但我希望它也能帮助您进行迁移。

这是 Django 的旧代码

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

我使用自定义模板 sn-ps 将其替换为 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 循环并不漂亮。需要再看一遍。

在模板 sn-p 中,我可以使用 &lt;span&gt;{{widget.attrs.description | safe}}&lt;/span&gt; 呈现选项后面的描述

形式保持不变:

class MyForm(forms.Form):

    order_method = ChoiceField(
        widget=MyRadioSelect,
        required=True)

重要提示:要让 Django 在常规模板文件夹中找到您的自定义模板 sn-ps,请将其添加到您的设置中:

FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'

django.forms 到你的INSTALLED_APPS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多