2016-08-05 63 views
1

我創建了使用的默認SelectDateWidget和一個自定義SelectTimeWidget定製SelectTimeDateWidgetMultiWidget打破模板

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}}, 

回答

0

用戶可於MultiWidget覆蓋format_output方法。它需要一個參數,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 }}等在您的模板中。

+0

謝謝!這工作完美。我還想添加一個「今日」按鈕,將今天的日期和時間放入選擇輸入內,我將如何去做這件事?如果你不介意我問 –

+0

你應該爲此提出單獨的問題。它可能會完全在JavaScript中完成。檢查django管理員的執行情況。 – GwynBleidD

+0

FWIW我認爲這與1.11及其基於模板的小部件渲染不同。可悲的是,東西似乎仍然不透明 - 我無法弄清楚如何提供自定義模板。它需要對我還找不到的裝載機進行一些更改。 – umbrae