我带来了一个非常奇怪的 Django 1.4 行为,这对我来说听起来像是一个错误。如果有人经历过,我到处寻找,但没有找到任何东西。
我担心的是使用 ModelForm 创建 Django 表单,模型包含布尔字段。
LetPost
和Topic
两个模型应该看起来像:
class Topic(models.Model):
my_bool = models.BooleanField(default=False)
class Post(models.Model):
topic = models.ForeignKey(Topic, related_name='posts')
现在,我将尝试使用 TopicForm 生成一个表单,该类在其他地方定义:
post = Post.objects.get(pk=id_post)
f = TopicForm(instance=post.topic)
print f
它工作正常:如果在 DBmy_bool
中为 False,则不选中该复选框。如果my_bool
为 True,则选中该复选框。这是结果:
<p><label for="id_my_bool">my_bool:</label> <input type="checkbox" name="my_bool" id="id_my_bool" /></p>
问题 !
好的,问题来了:如果我get_object_or_404
用来获取我的Post
对象,那么my_bool
字段将始终被检查!看这个 :
post = get_object_or_404(Post.objects.select_related('topic'), pk=id_post)
f = TopicForm(instance=post.topic)
print f
输出(奇怪):
<p><label for="id_my_bool">my_bool:</label> <input checked="checked" type="checkbox" name="my_bool" value="0" id="id_my_bool" /></p>
注意:我尝试了其他几种方法来获取Post
对象,它们都可以正常工作:
post = Post.objects.filter(pk=id_post)[0]
post = get_object_or_404(Post, pk=id_post)
post = Post.objects.get(pk=id_post)
唯一使它成为错误的是:
post = get_object_or_404(Post.objects.select_related('topic'), pk=id_post)
注释
- 使用 Django 1.3,它没有任何问题:只有 Django 1.4 使它成为错误。
- 我发现了一些似乎相关的 Django 1.4 错误,例如:
- 我不使用 MySQL GIS 后端,但是
django.db.backends.mysql
.
你有什么想法吗?
非常感谢您提前!