13

Boolean データが JavaScript から Django ビューに送信されると、"True"/"False" (大文字) ではなく "true"/"false" (小文字) として渡されることに気付きました。これにより、アプリケーションで予期しない動作が発生します。例えば:

投票.js

    ....
    var xhr = {
        'isUpvote': isUpvote
    };

    $.post(location.href, xhr, function(data) {
        doSomething()
    });

    return false;
});

ビュー.py

def post(self, request, *args, **kwargs):
    isUpvote = request.POST.get('isUpvote')
    vote, created = Vote.objects.get_or_create(user_voted=user_voted)

    vote.isUp = isUpvote
    vote.save()

この投票を保存してDjango管理ページを確認すると、javascriptからtrueまたはfalseが渡されたかどうかにかかわらず、「isUpvote」は常にTrueに設定されます。では、javascript の「true/false」ブール値を Django の「True/False」値に変換する最良の方法は何ですか?

ありがとう!!

追加した:::::

さて、ビューで何か間違ったことをしていないかどうかを確認するために、いくつかの「印刷」行を追加しました。

    print(vote.isUp)
    vote.isUp = isUpvote
    print(vote.isUp)

    vote.save()

結果:

    True
    false    //lowercase

そして、Django管理者を確認すると、「True」として保存されています!!! したがって、これは、何らかの奇妙な理由で、lowercaesの「false」がDjangoの「True」値として保存されることを意味すると思います....

4

11 に答える 11

13

おそらく、「isUpvote」値を文字列「true」または「false」として持ち、json を使用してそのブール値を区別する方が良いかもしれません

import json

isUpvote = json.loads(request.POST.get('isUpvote', 'false')) # python boolean
于 2015-07-13T12:40:00.197 に答える
1

ブール値に変換するJavascriptの方法は

//あなたの変数はあなたが変換したいものです
var myBool = Boolean(yourVariable);

ただし、上記のコードでは、ここで変数の代わりに文字列を渡しているようです

isUpvote = request.POST.get('isUpvote')

あなたはそれを正しくやっていますか?

于 2013-08-12T02:00:10.813 に答える
1

もう 1 つの方法は、ast(Abstract Syntax Tree) ライブラリのliteral_eval() を使用することです。

Javascript/jquery の場合:

$.ajax({
    url: <!-- url for your view -->,
    type: "POST",
    data: {
        is_enabled: $("#id_enable_feature").prop("checked").toString() <!-- Here it's either true or false> 
    }
})

Django ビューでは、

from ast import literal_eval

def example_view(request):
    is_enabled = literal_eval((request.POST.get('is_enabled')).capitalize())
    print(is_enabled)    # Here, you can check the boolean value in python like True or False
于 2020-01-02T09:02:30.793 に答える
0

私は通常、JavaScript ブール値を数値に変換します。

var xhr = {
    'isUpvote': Number(isUpvote)
};

パイソンでは:

try:
  is_upvote = bool(int(request.POST.get('isUpvote', 0)))
except ValueError:
  // handle exception here
于 2018-10-11T05:20:50.633 に答える