2012-02-03 3 views
4

私はフォームの初期値がend_dateです。今年はうるう年で、私たちは現在2月ですので、私はバリューエラーが発生しています。うるう年とそれに応じた設定を調べる

私のコードの終了日は30ですが、うるう年が見つかったコードを書き込んで2月2日の正しい最終日にend_dateを設定する方法がわかりません。ここで

は 私のinitを@Paulに話した後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 あるになった:

の最後の日を見つけ
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

クマ私はあなた 'leapyear場合とfeb'文がブール論理内のすべての条件が評価されるなら、私が考える行った場合を見てsidetracked-得るよう:ような何か。私たちはそうではありません([短絡](http://docs.python.org/library/stdtypes.html#boolean-operations-and-or-not))。今のように、48匹のうち12ヵ月が閏年になり、その比較は12匹の月の値を調べなければなりません。しかし、もしあなたが48のうち4回だけそれをfebにして、そしてそれはうるう年の値を調べなければならないでしょう。ハハ。この最適化(?)は、金曜日の午後 –

+0

@j_sykであなたに持ってきました。私はそれを変更しました。 – TheLifeOfSteve

+0

私は新しい、ランダムなものを学ぶのが好きです。この例ではおそらく重要ではないでしょう。 datetimeオブジェクトの属性が非常に高価であることは本当に疑問です。しかし、比較の1つの部分がスキップするのが良いデータベースクエリやその他の重い操作を含む場合は、そのことを念頭に置いておくとよいでしょう。何かを研究するように私に促すために_you_に感謝します! haha –

答えて

7

calendar.isleap(year)

また、try/exceptを使用してこれを処理するのではなく、ifという条件付きで処理しないでください。私と一緒に

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

ポールありがとう。私はできるだけ早くそれを受け入れるだろうと私は解決策を見るために人々のためのコードを更新します – TheLifeOfSteve

+0

私はこの答えが好きですが、なぜこれを処理するための良い方法を試してみませんか? – Lostsoul

+0

私はもっと良い解決策を見つけました。私は自分のコードを更新した、私が投稿した解決策は、最高ですか? – TheLifeOfSteve

関連する問題