2017-01-03 42 views
0

我在我的Django項目顯示的形式,而形式的領域之一是DateTimeInput部件,以定義:Django窗體DateTimeInput小部件 - 如何指定最大日期?

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之前或2017年12月31日之後的日期(顯示在用戶選擇表單中的字段時顯示的datetimepicker日曆中)顯示爲「灰色」,並且無法選擇它們。我想要的功能,但我只是想改變其所執行的日期的值,這樣至少整個下一日曆年的始終是可選擇的。

...我已經尋找maxDate &在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,這樣用戶才能選擇日期直到明年12月,而不是直到今年12月?

編輯

目前正使用的widgetmDateTimeField也在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內置功能的一部分嗎?我會在哪裏將你寫的代碼放在你的答案中?在'forms.py'中的類'mDateTimeField'裏面,或者在'view'中創建的表單實例的參數裏面? – someone2088