2017-01-03 45 views
0

У меня есть форма отображения в моем проекте Django, и один из полой формы является DateTimeInput виджетом, определенный с:Форматы Django DateTimeInput widget - как указать максимальную дату?

presentation_date = mDateTimeField(required=False, label="Presentation date", widget=forms.DateTimeInput(format='%d/%m/%Y %H:%M')) 

Этот виджет в настоящее время отображается все даты между началом прошлого года до конца этого год (01/01/2016- 31/12/2017). Однако в конце прошлого года это вызвало некоторые проблемы, поскольку это означало, что пользователям не удалось выбрать даты для начала этого года. Я хочу расширить диапазон дат, доступных для выбора в виджетах, на один год (т. Е. Новый диапазон будет 01/01/2016-31/12/2018).

Я понимаю, что это можно сделать с помощью проверки формы (например, путем записи вида, такого как clean_presentation_date(), и выполнения проверки внутри этого представления, но это не решит проблему, которую я имею - в настоящее время , даты до 01/01/2016 или после 31/12/2017 (отображается в календаре datetimepicker, который отображается, когда пользователь выбирает поле в форме) «greyed out», и их невозможно выбрать. функциональные возможности, которые я хочу, но я просто хочу, чтобы изменить значения даты, в которых она выполняется, так что по крайней мере, весь следующий календарный год всегда выбирается.

Я искал maxDate & minDate в файле forms.py, где форма с этим полем определена, но не может найти ничего похожего на то, что ограничивает, какие даты доступны для выбора, и которые не могут быть выбраны.

view, который показывает страницу с этой формой на нем определяется с:

def concept(request, project_id): 
    project = Project.objects.prefetch_related('budget_versions').get(id=project_id) 
    deposit = Deposit.objects.get_or_create(project=project)[0] 
    presentations = project.budget_versions.select_related('meeting').prefetch_related('budget_items', 'cci_items', 'presenters').filter(version_number__isnull=False).annotate(vn=F('version_number') * -1).order_by('presentation_date', 'created', '-vn') 
    end_details = EndDetails.objects.get_or_create(project=project)[0] 
    presentation_formset = BudgetPresentationFormset(prefix="presentations", instance=project, queryset=presentations) 
    drawing_formset = DrawingUploadFormset(prefix="drawings", queryset=Drawing.objects.filter(budget__in=presentations).order_by('budget__presentation_date', 'budget__created')) 

    context = { 
     'project': project, 
     'presentations': presentations, 
     'presentation_formset': presentation_formset, 
     'drawing_formset': drawing_formset, 
     'deposit_form': DepositInfoForm(instance=deposit), 
     'ended_form': EndDetailsForm(instance=end_details), 
     'budget_notes_form': BudgetNotesForm(instance=project.budget_overview), 
    } 

Конкретная form Я смотрю на это presentations один, определенный в forms.py:

class FirstPresentationForm(ValidatedForm): 
    """ UNUSED """ 
    who_presenting = forms.CharField() 
    details = forms.CharField(required=False, label='Original option costed') 
    presentation_date = mDateTimeField(required=False, label="Presentation date", widget=forms.DateTimeInput(format='%d/%m/%Y %H:%M')) #ERF(19/12/2016 @ 1210) Remove 'datetimepicker' from field..., attrs=({'class':'datetimepicker'}))) 

    class Meta: 
     model = Budget 
     fields = ('presentation_date','who_presenting','details') 

    def __init__(self, *args, **kwargs): 
     instance = kwargs.get('instance', {}) 
     project = instance.project 

     who_presenting = [pe.employee.id for pe in project.assigned.select_related('employee').filter(role=Role.P)] 
     #Make into an array with two employee IDs, or None. If two results were found, they will already be in the right format 
     if len(who_presenting)==1: 
      who_presenting.append(None) 
     elif not who_presenting: 
      who_presenting = None 

     if instance.presentation_date: 
      pres_meeting, created = Meeting.objects.get_or_create(project=project, purpose='6') 
      self.pres_meeting_id = pres_meeting.id 
      self.pres_meeting_creator = pres_meeting.event_creator or '' 
      if created: 
       pres_meeting.date = instance.presentation_date 
       pres_meeting.save() 

     initial = kwargs.get('initial', {}) 
     initial={ 
        'who_presenting': who_presenting, 
        } 
     kwargs['initial'] = initial 

     super(FirstPresentationForm, self).__init__(*args, **kwargs) 
     self.fields['who_presenting'] = AutoFlexiSelect(model='e', required=False, choices=get_choices('DESIGN_EMPLOYEE_CHOICES'), current_id=who_presenting, label="Who is presenting") 
     self.fields['presentation_date'].widget.attrs.update({'data-meeting-id': getattr(self,'pres_meeting_id', ''), 'data-meeting-creator': getattr(self,'pres_meeting_creator', '')}) 

    def save(self, commit=True): 
     project = self.instance.project 
     data = self.cleaned_data 

     try: ProjectEmployee.objects.filter(project=project, role=Role.P).delete() #Delete current records, if any, to prevent build up on editing this field 
     except ObjectDoesNotExist: pass 
     if data['who_presenting']: 
      designers = data['who_presenting'] 
      # Get the ids from the form field (received as a string) 
      designers = [re.sub('\D+', '', s) for s in designers.split(',')] 

      who_presenting_1 = Employee.objects.get(id=designers[0]) 
      who_presenting_2 = designers[1] #If only one employee in selected choice, this will be None 
      if who_presenting_2: who_presenting_2 = Employee.objects.get(id=designers[1]) #If two employees in selected choice, sets the second one 

      pe = ProjectEmployee(project=project, employee=who_presenting_1, role=Role.P) 
      pe.save() 

      if who_presenting_2: #If a second designer, delete as well 
       pe = ProjectEmployee(project=project, employee=who_presenting_2, role=Role.P) 
       pe.save() 

     if 'presentation_date' in self.changed_data: 
      from events.models import refresh_group_cache 
      print '************' 
      pres_meeting = Meeting.objects.get(project=project, purpose='6') 
      self.instance.meeting = pres_meeting 
      self.instance.save() 
      print 'Updating date', data['presentation_date'], pres_meeting.id 
      pres_meeting.date = data['presentation_date'] 
      pres_meeting.save() 
      refresh_group_cache(pres_meeting.event_creator.calendar_id, pres_meeting.date.year, pres_meeting.date.month, pres_meeting.event_id, pres_meeting) 

     return super(FirstPresentationForm, self).save(commit=commit) 

Я попытался передать/установить max_date как атрибут переменной presentation_date, но у него нет атрибута/свойства по этому имени ...

Как указать конкретную дату как widgetmaxDate, чтобы пользователь мог выбрать даты до декабря следующего года, а не только до декабря этого года?

Редактировать

mDateTimeField, который с помощью widget также определяется в forms.py с:

class mDateTimeField(forms.DateTimeField): 
    def __init__(self, *args, **kwargs): 
     kwargs.setdefault('input_formats', DATE_INPUT_FORMATS) 
     super(mDateTimeField, self).__init__(*args, **kwargs) 

ответ

0

Это должно помочь вам:

widgets = { 
    'start_date': forms.DateInput(attrs={ 
     'class':'datepicker', 'data-min': YOUR_MIN_DATE, 
     'data-max': YOUR_MAX_DATE}), 
} 

Использование:

minDate: $(this).data('min'), 
maxDate: $(this).data('max'), 
+0

Спасибо за ваш ответ. Я не знаю, где бы я это сказал? Нужно ли мне настраивать определение «виджета» где-то? Я использую 'DateTimeInput', а не' DateInput' ... не знаю, имеет ли это значение ...? – someone2088

+0

Да, вы должны настроить свой виджет. И вы можете использовать вышеуказанный код.Просто добавьте то же самое в свой код –

+0

Где я могу настроить виджет? Разве это не часть встроенных функций Django? Куда бы я поставил код, который вы написали в своем ответе? Внутри класса 'mDateTimeField' в' forms.py' или внутри параметра экземпляра формы, который я создаю в 'view'? – someone2088