Kayでdefault=TrueのBooleanPropertyを作成すると、チェックボックスのチェックの有無にかかわらず、常にTrueになる。
myapp/views.py
class MyModel(db.Model):
flag = db.BooleanProperty(default=True)
class MyForm(ModelForm):
class Meta:
model = MyModel
def index(request):
form = MyForm()
if request.method == 'POST' and form.validate(request.form):
form.save()
return render_to_response('myapp/index.html',
{'form': form.as_widget()})
myapp/templates/index.html
{{ form() | safe }}
フォームのチェックボックスをチェックしても、チェックしなくても、登録されるMyModelのflagの値はTrueになる。
なぜ常にTrueになってしまうのか。
上のコードでは、次のようなHTMLが出力される。(一部省略)
<form action="" method="post">
<label for="f_flag">Flag</label>
<input type="checkbox" id="f_flag" name="flag">
<input type="submit" value="送信">
</form>
チェックボックスをチェックしたときは、チェックボックスのデータが送信され、MyModelのflagの値はTrueになる。
チェックボックスをチェックしなかったときは、チェックボックスのデータは送信されない。
そうすると、MyModelのflagの値は設定されないのでdefaultの値であるTrueになる。
さて、他のWebアプリケーションフレームワークはこの問題にどう対処しているのか。
Ruby on Rails
<input name="data[flag]" type="hidden" value="0" />
<input id="data_flag" name="data[flag]" type="checkbox" value="1" />
CakePHP
<input type="hidden" name="data[Model][field]" value="0" id="ModelField_" /
<input type="checkbox" name="data[Model][field]" value="1" id="ModelField" />
と、チェックボックスの他にhiddenフィールドを作成していた。
チェックしたときはチェックボックスの値「1」をがあればTrue、
「1」がなくて「0」があればFalse、
「1」も「0」もなければ初期値、
ということだろう。
うまい方法だと思う。