Pythonで○日後の日付を計算する

dateオブジェクトにtimedeltaオブジェクトを加算することで、○日後の日付を取得することができます。

>>> import datetime
>>> d = datetime.date(2010,1,1)
>>> d
datetime.date(2010, 1, 1)
>>> d+datetime.timedelta(1) #1日後
datetime.date(2010, 1, 2)
>>> d-datetime.timedelta(2) #減算すると○日前
datetime.date(2009, 12, 30)

Google App Engine用フレームワークKayのMultiChoiceFieldの選択肢を実行時に設定する

GoogleAppEngine用フレームワークKayのMultiChoiceFieldの選択肢を実行時に設定する方法。

FormのMultiChoiceFieldのchoices属性の値を変更します。

myapp/views.py

from kay.utils import forms
class MyForm(forms.Form):
    message = forms.TextField(required=True)
    flags = forms.MultiChoiceField(choices=[1,2,3])

def index(request):
    form = MyForm({'message':u'メッセージ', 'flags': [1,3]}) #フォームに初期値を設定
    form.flags.choices = [1,2,3,4,5] #選択肢を変更
    return render_to_response('myapp/index.html', 
                              {'form':form.as_widget()})

Google App Engine用フレームワークKayで、Formの初期値を設定する

Google App Engine用フレームワークKayで、Formの初期値を設定するには、コンストラクタに初期値を辞書 (dictionary) で渡します。

from kay.utils import forms
class MyForm(forms.Form):
    message = forms.TextField(required=True)
    flags = forms.MultiChoiceField(choices=[1, 2, 3])

def index(request):
    form = MyForm({'message':u'メッセージ', 'flags': [1,3]}) #フォームに初期値を設定
    return render_to_response('myapp/index.html', 
                              {'form':form.as_widget()})

ModelFormにmodelの値を設定するには、キーワード引数instanceを使用します。

from google.appengine.ext import db
from kay.utils.forms.modelform import ModelForm 

class MyModel(db.Model):
    message = db.StringProperty()

class MyForm(ModelForm):
    class Meta:
        model = MyModel 

def index(request):
    model = MyModel(message=u'メッセージ') #モデルに初期値を設定
    form = MyForm(instance=model) #フォームにモデルの値を設定
    return render_to_response('myapp/index.html', 
                              {'form':form.as_widget()})

MultiChoiceFieldの初期値を設定するには、「ModelFormのMultiChoiceFieldの初期値について」のStringListPropertyPassThroughを使用する必要があります。

from google.appengine.ext import db
from kay.utils.forms.modelform import ModelForm 

class StringListPropertyPassThrough(db.StringListProperty):
    def get_value_for_form(self, instance):
        value = db.ListProperty.get_value_for_form(self, instance)
        if not value:
            return None
        return value

    def make_value_from_form(self, value):
        if not value:
            return []
        return value 

class MyModel(db.Model):
    flags = StringListPropertyPassThrough()

class MyForm(ModelForm):
    flags = forms.MultiChoiceField(choices=[u'Python', 'Perl', 'PHP']) 
    class Meta:
        model = MyModel 

def index(request):
    model = MyModel(flags = [u'Python', 'PHP']) 
    form = MyForm(instance=model) 
    return render_to_response('myapp/index.html', 
                              {'form':form.as_widget()})

Google App Engine用フレームワークKayの日付入力欄をjQueryで入力しやすくする

Google App Engine用フレームワーク「Kay」の日付入力欄をjQueryで入力しやすくする方法。

Kayの日付入力欄(DateField)は一行入力欄(<input type=”text” >)で入力形式として「yyyy-mm-dd」の形で入力する必要があり、使い勝手が悪いように感じました。

そこで、jQuery UIのDatepickerを使って、入力しやすくします。

jQueryの設置

jQuery UI – ThemeRoller」のページでデザインを設定して、ダウンロードします。

ダウンロードしたファイルを展開します。

展開したファイルを、静的ファイルの設置フォルダーにコピーします。
静的ファイルの設置フォルダーは「app.yaml」の「static_dir」で設定します。

app.yaml

- url: /media
  static_dir: media

参考:「静的ファイルの使用 – Google App Engine – Google Code

フォームの作成

フォームを作成します。

myapp/views.py

from kay.utils import forms
class MyForm(forms.Form):
    date = forms.DateField(required=True)

def index(request):
    form = MyForm()
    msg = u''
    if request.method == 'POST':
        if form.validate(request.form):
            msg = 'OK'
    return render_to_response('myapp/index.html', 
                              {'msg':msg, 'form':form.as_widget()})

myapp/templates/index.html

<html><head>
</head><body>
<p>{{msg}}</p>
<div>{{ form()|safe }}</div>
</body></html>

「http://localhost:8080/」にアクセスしてフォームが表示されることを確認します。

jQuery UI Datepickerの使用

jQuery UIのDatepickerを使用します。

テンプレートファイルのヘッダにスタイルシートとJavaScriptを読み込むためのタグを追加します。

<link href="/media/~/jquery-ui-1.8.1.custom.css"  rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/media/~/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="/media/~/jquery-ui-1.8.1.custom.min.js"></script>
<script type="text/javascript" src="/media/~/ui/i18n/jquery.ui.datepicker-ja.js"></script>

myapp/templates/index.html

<html><head>
<link href="/media/~/jquery-ui-1.8.1.custom.css"  rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/media/~/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="/media/~/jquery-ui-1.8.1.custom.min.js"></script>
<script type="text/javascript" src="/media/~/ui/i18n/jquery.ui.datepicker-ja.js"></script>
</head><body>
<p>{{msg}}</p>
<div>{{ form()|safe }}</div>
</body></html>

次に、以下のコードを追加して、日付入力欄にDatepickerを適用します。

<script type="text/javascript">
$(function() {
  $('#f_date').datepicker().val();
});
</script>

myapp/templates/index.html

<html><head>
<link href="/media/~/jquery-ui-1.8.1.custom.css"  rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/media/~/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="/media/~/jquery-ui-1.8.1.custom.min.js"></script>
<script type="text/javascript" src="/media/~/ui/i18n/jquery.ui.datepicker-ja.js"></script>
<script type="text/javascript">
$(function() {
  $('#f_date').datepicker().val();
});
</script>
</head><body>
<p>{{msg}}</p>
<div>{{ form()|safe }}</div>
</body></html>

これでDatepickerが動作するようになりました。

しかし、まだ問題があります。

Datepickerは「yyyy/mm/dd」の形式で入力されますが、Kayの日付入力欄は「yyyy-mm-dd」の形式で入力しないとエラーになります。

そこで今回はjquery.ui.datepicker-ja.jsを編集して、Datepickerで日付を選択したときに「yyyy-mm-dd」の形式で入力できるようにします。

jquery.ui.datepicker-ja.js

jQuery(function($){
  …
    dateFormat: 'yy-mm-dd', //変更
  …
});

これで、Datepickerで日付を選択すると、Kayの日付入力欄の形式で日付が設定されるようになりました。