У меня есть форма отображения в моем проекте 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
, но у него нет атрибута/свойства по этому имени ...
Как указать конкретную дату как widget
maxDate
, чтобы пользователь мог выбрать даты до декабря следующего года, а не только до декабря этого года?
Редактировать
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)
Спасибо за ваш ответ. Я не знаю, где бы я это сказал? Нужно ли мне настраивать определение «виджета» где-то? Я использую 'DateTimeInput', а не' DateInput' ... не знаю, имеет ли это значение ...? – someone2088
Да, вы должны настроить свой виджет. И вы можете использовать вышеуказанный код.Просто добавьте то же самое в свой код –
Где я могу настроить виджет? Разве это не часть встроенных функций Django? Куда бы я поставил код, который вы написали в своем ответе? Внутри класса 'mDateTimeField' в' forms.py' или внутри параметра экземпляра формы, который я создаю в 'view'? – someone2088