将Django从1.9迁移到1.11:forms.MultiWidget.format_output消失了

时间:2017-09-26 12:29:40

标签: django django-forms

此方法对于在Django 1.9中呈现MultiWidget非常有用:

format_output(rendered_widgets)

我在很多地方使用它,这是一个使用示例:

def format_output(self, rendered_widgets):
    items = [ '%s %s' % (rendered_widgets[i], f)
                            for (i,f) in enumerate(self.fieldnames) ]
    if self.aligned:
        return '<li>' + '</li><li>'.join(items) + '</li>'
    else:
        return ' '.join(items)

它在Django 1.11中消失了,我找不到自然的替代品。 render方法似乎是唯一的选择,但我不了解如何正确使用它。

有人有想法吗?

2 个答案:

答案 0 :(得分:0)

我发现这个解决方案似乎有效:

#~ def format_output(self, rendered_widgets):
def render(self, name, value, attrs=None, renderer=None):
    if not value:
        value = [ False for x in self.fieldnames ]
    rendered_widgets = [ x.render(name, value[i]) for i,x in enumerate(self.widgets) ]
    ... # rest is the same

修改

事实上,不,它不起作用。 rendered_widgets计算必须是:

rendered_widgets = [ x.render('%s_%d' % (name,i), value[i]) for i,x in enumerate(self.widgets) ]

我在这个问题上花了太多时间,这是一个related post但为什么format_output已被移除???

答案 1 :(得分:0)

不在乎format_output。只需从django.forms.widgets.MultiWidget继承并使用此方法: get_context(self, name, value, attrs)在django / forms / widgets.py

中定义

在扩展此方法的过程中,您可以定义上下文值。 要找出其具有的字段,只需用super().get_context(name, value, attrs)调用上方的字段并执行以下操作: print(context)。 所有数据都在“小部件”字段及其子字段下,包括字段“ subwidgets”。

要为此小部件设置模板,请在类主体中设置template_name属性。默认情况下,它设置为: template_name = 'django/forms/widgets/multiwidget.html'

现在,在小部件模板中,您可以使用以下方式访问子小部件: widget.subwidgets.X,其中X是从0开始的索引。此模板变量仅包含数据字典(您可以通过直接引用它来打印模板中的内容,例如。 {{ widget.subwidgets.0 }} 要格式化显示的子小部件,只需执行以下操作: {% include widget.subwidgets.0.template_name with widget=widget.subwidgets.0 %}

当然,您可以根据需要迭代子部件,在我的情况下,这不是一个选择。

您可以在此处了解更多信息: https://docs.djangoproject.com/en/1.11/_modules/django/forms/widgets/#Widget.get_context 和这里: https://docs.djangoproject.com/en/1.11/ref/forms/widgets/

关于, 克里斯