2

我带来了一个非常奇怪的 Django 1.4 行为,这对我来说听起来像是一个错误。如果有人经历过,我到处寻找,但没有找到任何东西。

我担心的是使用 ModelForm 创建 Django 表单,模型包含布尔字段。

LetPostTopic两个模型应该看起来像:

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)

注释

你有什么想法吗?

非常感谢您提前!

4

2 回答 2

3

在我的应用程序中有相同的错误并找到已打开的票证。似乎主要问题是成对的select_related 和 MySQL:MySQL为布尔值返回整数,但 Django 在使用 select_related 时无法将它们与相应的模型相关联;因此,CheckboxInput获取值 0 而不是 False 并将其视为复选框列表中的值。

你可以:

  1. 使用票证中的补丁;
  2. 或避免使用select_related
  3. 或修补CheckboxInput小部件:

    class SingleCheckboxInput(forms.CheckboxInput):
        def render(self, name, value, attrs=None):
            if value in (0, 1):
                value = bool(value)
            return super(SingleCheckboxInput, self).render(name, value, attrs)
    
    class TopicForm(django.forms.ModelForm):
        class Meta:
            model = Topic
            widgets = {'my_bool': SingleCheckboxInput}
    
于 2012-10-25T11:30:59.617 回答
0

我看到了一个类似的错误,如果我取消选中所有框,则 POST 数据为空!如果我只取消一个,POST 数据就会到达。不要调用 get_object_or_404(),而是检查您的入站 request.POST 数据。

于 2012-05-24T03:00:45.780 回答