此方法对于在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
方法似乎是唯一的选择,但我不了解如何正确使用它。
有人有想法吗?
答案 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/
关于, 克里斯