2012-02-03 3 views
4

У меня есть форма, которая имеет начальный 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 })) 

Который находит последний день текущий месяц.

+1

медведь со мной, как я получаю sidetracked- Видя ваш 'если leapyear и если feb' заявление заставило меня думать о том, если все условия в булевой логики оцениваются. Мы не будем ([короткое замыкание] (http://docs.python.org/library/stdtypes.html#boolean-operations-and-or-not)). Как и сейчас, 12 месяцев из каждых 48 будут скачкообразными, и сравнение будет стоить 12 раз. Но если вы переверните заказ (месяц, то leapyear) только 4 раза из 48, это будет feb, и тогда ему придется искать значение високосного года. ха-ха. эта оптимизация (?) принесла к вам в пятницу днем ​​ –

+0

@j_syk haha ​​Я благодарю вас за это. Я изменил его. – TheLifeOfSteve

+0

Мне нравится изучать новые, случайные вещи ха-ха. это, вероятно, действительно не важно в этом примере. Я действительно сомневаюсь, что атрибуты объекта datetime очень дорогостоящие. Но, кажется, хорошо помнить об этом, если одна часть сравнения включает запрос к базе данных или какую-либо другую более тяжелую операцию, которую было бы неплохо пропустить. Благодарю _you_ за то, что побудили меня что-то исследовать! haha –

ответ

7

Как насчет calendar.isleap(year)?

Кроме того, не используйте try/except, чтобы обрабатывать это, но if условно. Что-то вроде:

if calendar.isleap(year): 
    do_stuff 
else: 
    do_other_stuff 
+0

Спасибо, Пол. Я соглашусь, как только это позволит мне, и я обновлю код для людей, чтобы увидеть решение. – TheLifeOfSteve

+0

Мне нравится этот ответ, но почему использование try не является хорошим способом справиться с этим? – Lostsoul

+0

Я нашел лучшее решение, которое я считаю. Я обновил свой код, это решение, которое я опубликовал, лучший? – TheLifeOfSteve

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

  • Нет связанных вопросов^_^