模板中的MultiWidget中断

时间:2016-08-05 08:01:05

标签: django django-forms django-templates django-views

我创建了一个使用默认SelectDateWidget和自定义SelectTimeWidget的自定义SelectTimeDateWidget

class SelectDateTimeWidget(forms.MultiWidget):
    supports_microseconds = False

    def __init__(self, attrs=None, date_format=None, time_format=None):
        widgets = (SelectDateWidget(empty_label=( "Year", "Month", "Day")),
                   SelectTimeWidget(use_seconds=False))
        super(SelectDateTimeWidget, self).__init__(widgets, attrs)

    def decompress(self, value):
        if value:
            value = to_current_timezone(value)
            return [value.date(), value.time().replace(microsecond=0)]
        return [None, None]

小部件都可以正常工作,但因为它们在表单模板中彼此相邻,所以它看起来非常集群,而且不是非常用户友好。所以我需要一种方法来放置一个中断标签,并且可能在它们之间放置一个标签。我无法在网上找到任何东西(也许我没有正确的措辞)

这是表单模板中的代码,两个小部件都在那个标签中,所以我很难想出一种方法将它们划分到不同的行,任何想法?

<label> Start Time/Date:</label>
{{form.start}},

1 个答案:

答案 0 :(得分:0)

您可以从MultiWidget覆盖rendered_widgets方法。它需要一个参数 def format_output(self, rendered_widgets): return '<br>'.join(rendered_widgets) ,它只是一个渲染的子小部件列表。默认实现只是加入它们,但你可以随心所欲地使用它们。例如:

MultiWidget

或者,如果您想在模板中的小部件之间写一些内容,请将此方法添加到 def subwidgets(self, name, value, attrs=None): 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') 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)) return output 实现中:

{{ form.start.0 }}

您应该能够在模板中使用{{ form.start.1 }},{{1}}等。