Kayでdefault=TrueのBooleanPropertyを作成すると、チェックボックスのチェックの有無にかかわらず、常にTrueになる。

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」もなければ初期値、
ということだろう。

うまい方法だと思う。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください