2

私には本当に奇妙なDjango1.4の動作がありますが、これは私にはバグのように聞こえます。誰かがそれを経験した場合、私はどこを見ても、何も見つかりませんでした。

私の懸念は、ブールフィールドを含むモデルでModelFormを使用してDjangoフォームを作成することです。

Postと2つ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の場合、チェックボックスはオンになりません。Trueの場合my_bool、チェックボックスがオンになります。結果は次のとおりです。

<p><label for="id_my_bool">my_bool:</label> <input type="checkbox" name="my_bool" id="id_my_bool" /></p>

問題 !

OK、ここに問題があります:オブジェクトget_object_or_404を取得するために使用する場合、フィールドは常にチェックされます!これを見てください:Postmy_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はブール値の整数を返しますが、select_relatedを使用すると、Djangoはそれらを対応するモデルに関連付けることができません。その結果、CheckboxInputはFalseではなく値0を取得し、チェックボックスリストの値のように扱います。

あなたはできる:

  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データが空になります。1つだけアンチェックすると、POSTデータが到着します。get_object_or_404()を呼び出す代わりに、インバウンドrequest.POSTデータを調べます。

于 2012-05-24T03:00:45.780 に答える