2016-08-05 2 views
1

Я создал пользовательский SelectTimeDateWidget, который использовал SelectDateWidget по умолчанию и пользовательские SelectTimeWidgetMultiWidget Перерыв в шаблоне

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

Вы можете просто переписать format_output метод из 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 }} и так далее в вашем шаблоне.

+0

Спасибо! Это сработало отлично. Я также хотел бы добавить кнопку «Сегодня», которая помещает сегодняшнюю дату и время в выбранные входы, как бы я это сделал? Если вы не возражаете, я спрашиваю –

+0

. Вы должны задать для этого отдельный вопрос. Вероятно, это будет сделано в JavaScript. Проверьте реализацию django admin. – GwynBleidD

+0

FWIW Я думаю, что теперь это отличается от 1.11 и его визуализации виджета на основе шаблонов. К сожалению, этот материал кажется довольно непрозрачным - я не могу понять, как создать пользовательский шаблон. Это требует некоторых изменений для загрузчиков, которые я пока не могу найти. – umbrae

Смежные вопросы