我有一个带有两个由两个TextInput组成的MultiWidget的Django表单字段。

在模板中呈现表单时,有一个方便的符号

{{ formname.fieldname }}


用于呈现单个字段。当我将其用于MultiWidget的字段时,它将显示两个HTML输入元素。是否仅对第一个HTML输入元素显示符号进行了少许修改? ({{ formname.fieldname.0 }}不起作用。)

最佳答案

我找到了需要两个代码的解决方案。

第一

将MultiWidget转换为字符串的render方法相对较长。我们需要在最后一行中进行微小的修改来复制并粘贴它,以使其重新呈现数组。

class OurMultiWidget(forms.MultiWidget):
    ...

    def render(self, name, value, attrs=None):
        """Copy and past from original render method"""
        if self.is_localized:
            for widget in self.widgets:
                widget.is_localized = self.is_localized
        # value is a list of values, each corresponding to a widget
        # in self.widgets.
        if not isinstance(value, list):
            value = self.decompress(value)
        output = []
        final_attrs = self.build_attrs(attrs)
        id_ = final_attrs.get('id', None)
        for i, widget in enumerate(self.widgets):
            try:
                widget_value = value[i]
            except IndexError:
                widget_value = None
            if id_:
                final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
            output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
        # Original:
        # return mark_safe(self.format_output(output))
        # Only this line was written by myself:
        return [mark_safe(self.format_output(x)) for x in output]


第二

在模板中写入{{ formname.fieldname }}将自动调用该字段的unicode方法,并将结果视为字符串。因为我们需要数组,所以我们需要避开unicode方法并直接访问它将返回的内容。这就是方法as_widget。因此,要调用OurMultiWidget的第一部分,我们将在模板中需要以下代码:

{{ formname.fieldname.as_widget.0 }}

10-07 21:54