У меня есть форма, которая имеет начальный end_date
. У меня ошибка Value, потому что в этом году високосный год, и в настоящее время мы в феврале.Выясните, существует ли его високосный год и соответственно
У моего кода есть день конца 30, но у меня возникли проблемы с выяснением того, как написать код, который обнаружит, если его високосный год и установить начальный end_date
в правильный последний день февраля.
Вот мой forms.py, который контролирует датой_окончания начального значения
class MaturityLetterSetupForm(forms.Form):
def __init__(self, *args, **kwargs):
from datetime import datetime
today = datetime.today()
start_year = today.year
start_month = today.month
start_date = datetime(start_year, start_month, 1)
try:
end_date = datetime(start_year, start_month, 30)
except ValueError:
end_date = datetime(start_year, start_month, ?)
super(MaturityLetterSetupForm, self).__init__(*args, **kwargs)
self.fields['start_date'] = forms.DateField(initial=start_date.strftime("%B %d, %Y"),
widget=forms.TextInput(attrs={'class':'datepicker', 'value': today }))
self.fields['end_date'] = forms.DateField(initial=end_date.strftime("%B %d, %Y"),
widget=forms.TextInput(attrs={'class':'datepicker', 'value': today }))
EDIT После разговора с @Paul моего INIT стал:
def __init__(self, *args, **kwargs):
from datetime import datetime
import calendar
today = datetime.today()
start_year = today.year
start_month = today.month
start_date = datetime(start_year, start_month, 1)
if calendar.isleap(start_year) and today.month == 2:
end_date = datetime(start_year, start_month, calendar.mdays[today.month]+1)
else:
end_date = datetime(start_year, start_month, calendar.mdays[today.month])
super(MaturityLetterSetupForm, self).__init__(*args, **kwargs)
self.fields['start_date'] = forms.DateField(initial=start_date.strftime("%B %d, %Y"),
widget=forms.TextInput(attrs={'class':'datepicker', 'value': today }))
self.fields['end_date'] = forms.DateField(initial=end_date.strftime("%B %d, %Y"),
widget=forms.TextInput(attrs={'class':'datepicker', 'value': today }))
Который находит последний день текущий месяц.
медведь со мной, как я получаю sidetracked- Видя ваш 'если leapyear и если feb' заявление заставило меня думать о том, если все условия в булевой логики оцениваются. Мы не будем ([короткое замыкание] (http://docs.python.org/library/stdtypes.html#boolean-operations-and-or-not)). Как и сейчас, 12 месяцев из каждых 48 будут скачкообразными, и сравнение будет стоить 12 раз. Но если вы переверните заказ (месяц, то leapyear) только 4 раза из 48, это будет feb, и тогда ему придется искать значение високосного года. ха-ха. эта оптимизация (?) принесла к вам в пятницу днем –
@j_syk haha Я благодарю вас за это. Я изменил его. – TheLifeOfSteve
Мне нравится изучать новые, случайные вещи ха-ха. это, вероятно, действительно не важно в этом примере. Я действительно сомневаюсь, что атрибуты объекта datetime очень дорогостоящие. Но, кажется, хорошо помнить об этом, если одна часть сравнения включает запрос к базе данных или какую-либо другую более тяжелую операцию, которую было бы неплохо пропустить. Благодарю _you_ за то, что побудили меня что-то исследовать! haha –