- 2008-02-13 (水) 4:34
- Django
newformでBooleanField関連のバグ(?)にあたった。
使っているのはsvn最新版のDjangoでバックエンドはMySQL5.0。
1.modelでBooloeanFieldを定義する
2.データベースにはtinyint型になる -> 0 or 1が入る
3.ModelFormを使ってフォーム作成
4.as_hiddenで出力 -> valueには0が設定される
5.そのままフォームで受け取ってバリデーション
6..データがTrueになってる!
Djangoのソースを見てみる。
newforms/forms.py 533行目から
-
class BooleanField(Field):
-
widget = CheckboxInput
-
-
def clean(self, value):
-
"""Returns a Python boolean object."""
-
super(BooleanField, self).clean(value)
-
# Explicitly check for the string 'False', which is what a hidden field
-
# will submit for False. Because bool("True") == True, we don't need to
-
# handle that explicitly.
-
if value == 'False':
-
return False
-
return bool(value)
bool(value)で0という「文字列」がTrueとなって返るみたい。
うーん。Falseって文字列だけチェックはまずくない?
"which is what a hidden field will submit for False"って、0か1が入ってるよ!
参考までに、db関連のコードがどうなっているか見てみた。
db/models/fields/__init__.py 445行目付近
-
class BooleanField(Field):
-
def __init__(self, *args, **kwargs):
-
kwargs['blank'] = True
-
Field.__init__(self, *args, **kwargs)
-
-
def to_python(self, value):
-
if value in (True, False): return value
-
if value in ('t', 'True', '1'): return True
-
if value in ('f', 'False', '0'): return False
-
raise validators.ValidationError, _("This value must be either True or False.")
db/backends/utils.py 86行目
-
def typecast_boolean(s):
-
if s is None: return None
-
if not s: return False
-
return str(s)[0].lower() == 't'
-
-
〜数行省略〜
-
-
def rev_typecast_boolean(obj, d):
-
return obj and '1' or '0'
二つのコードは違うけど、似たような処理をしている。
(typecast_booleanのほうは、文字列の0や1が入るのは想定していない様子。)
こんな感じの実装をnewformsのほうにも入れるべきなんだろうなー。
今回はカスタムフィールドを作る練習として、自分でMyBooleanFieldを定義して回避しといた。
関係ないけど、ModelFormはform_for_modelとかform_for_instanceに比べて自然な感じでいいと思う。
- Newer: 携帯の「電源をお切りください」とマナーモードについて
- Older: 髪型でオシャレしたいならタッチタイピングを覚えるべき
Comments:1
- 常山日記 08-02-14 (木) 3:32
-
[Django]巡回
Django Snippets: Comma separated users field django_template decorator Blog:…
Trackbacks:0
- Trackback URL for this entry
- http://blog.joyfullife.jp/archives/2008/02/13043425.php/trackback
- Listed below are links to weblogs that reference
- Django newformsのBooleanFieldで問題 from 30からのBlog