2007-12-05

django preview form 的一个问题

关键字: django preview form
在用Django preview form 碰到一个问题...怀疑是Django 的bug

当然也有可能是我的错误如果哪位同学也碰到,回下贴哈

Django 在使用 preview form 处理BooleanField 时,如果BooleanField的值False,那么当你提交时,Django会把 BooleanField的值改为True,然后返回本页面...但如果BooleanField值为True的话,Django 会让你顺利执行...

示例程序...
1. Is test 没有选中




2. 我点击了Preview按钮



3.我点击了submit按钮,注意红笔...




4.我点击了Preview按钮,显示仍与上图一样...
5.我再一次点击了submit按钮

评论
yimogod 2007-12-14
呵呵,谢谢大家...这个bug很容易遇到的.我想应该已经有人提交过了...
guotie 2007-12-13
newforms的确存在比较多的问题
jjx 2007-12-06
这个问题得确是django的 bug
问题在于django 总是将BooleanField的值处理成True,False,但有个地方存在不一致的地方,就是
CheckboxInput的value_form_datadict方法
  def value_from_datadict(self, data, files, name):
        if name not in data:
            # A missing value means False because HTML form submission does not
            # send results for unselected checkboxes.
            return False
        return super(CheckboxInput, self).value_from_datadict(data, files, name)

这个方法会导致一些错误,因为 data是个字符串的词典,因此,这个方法会返回bool的False(当data中没有is_test时)或字符串的'False'(当存在,但值为False时)
第一个是hash 值的计算,一开始的bool类型的False同unicode字符串的False是不同 的. 这样会导致当不核选时需要提交两次
其次是当render的时候,可以查看CheckboxInput的render方法,里面有个check_test,默认被设置为bool,这样,当调用bool('False')时,返回的就是True了

所以,修改上面的方法(或继承新建一个Checkbox2Input),让其根据实际情况返回bool值就ok了
比方说(这只是个quick and dirty的解决方法,英语好的可以提交bug,让django团队来处理这个问题)
   def value_from_datadict(self, data, files, name):
        if name not in data:
            # A missing value means False because HTML form submission does not
            # send results for unselected checkboxes.
            return False
        #print data[name],"value_form_datadict",type(data[name])
        result=super(CheckboxInput, self).value_from_datadict(data, files, name)
        return True if result in ['on','ON','True','true'] else False



由于存在这两个问题,因此光传入一个check_test lambda 还不足以解决问题,我一开始就以为这个能解决,呵呵
zbird 2007-12-05
如果你不选择,request里是没有值的。
估计你用的是 if request.POST。
因此根本就没有执行if里面的操作。
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

yimogod
搜索本博客
最近加入圈子
存档
最新评论