13

我注意到当布尔数据从 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 管理页面时,“isUpvote”总是设置为 True,无论是从 javascript 传递的是 true 还是 false。那么将 javascript 的“真/假”布尔值转换为 Django 的“真/假”值的最佳方法是什么?

谢谢!!

添加:::::

好吧,我添加了一些“打印”行来检查我是否做错了什么:

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

    vote.save()

结果:

    True
    false    //lowercase

然后当我检查我的 Django 管理员时,它被保存为“真”!!!所以我想这意味着由于某些奇怪的原因,小写字母“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 回答
6

尝试这个。

from django.utils import simplejson

def post(self, request, *args, **kwargs):
    isUpvote = simplejson.loads(request.POST.get('isUpvote'))
于 2013-08-12T03:26:47.693 回答
4

我遇到了同样的问题(Javascript 的真/假 - Python 需要真/假),但使用一个小函数修复了它:

def convert_trueTrue_falseFalse(input):
    if input.lower() == 'false':
        return False
    elif input.lower() == 'true':
        return True
    else:
        raise ValueError("...")

它可能对某人有用。

于 2014-04-29T07:47:56.520 回答
4

我遇到了同样的问题,我用更清晰的方式解决了这个问题。

问题:

如果我将以下 JSON 发送到服务器,布尔字段以 test("true", "false") 的形式出现,我必须访问cataloguesas request.POST.getlist("catalogues[]")。我也不能轻易地进行表单验证。

var data = {
   "name": "foo",
   "catalogues": [1,2,3],
   "is_active": false
}

$.post(url, data, doSomething);

Django 请求处理程序:

def post(self, request, **kwargs):
    catalogues = request.POST.getlist('catalogues[]')  # this is not so good
    is_active = json.loads(request.POST.get('is_active')) # this is not too

解决方案

我通过将 json 数据作为字符串发送并在服务器端将数据转换回 json 来解决这个问题。

var reqData = JSON.stringify({"data": data}) // Converting to string
$.post(url, reqData, doSomething);

Django 请求处理程序:

def post(self, request, **kwargs):
    data = json.loads(request.POST.get('data'))  # Load from string

    catalogues = data['catalogues'] 
    is_active = data['is_active']

现在我可以进行表单验证并且代码更干净:)

于 2014-03-20T14:59:51.457 回答
1

转换为布尔值的 Javascript 方法是

//您的变量是您要转换的变量
var myBool = Boolean(yourVariable);

但是,在您上面的代码中,您似乎在这里传递了一个字符串而不是变量

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

你确定你做对了吗?

于 2013-08-12T02:00:10.813 回答
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 回答
1

从js调用django rest api时我遇到了同样的问题,这样解决了:

isUpvote = request.POST.get("isUpvote")
isUpvote = isUpvote == True or isUpvote == "true" or isUpvote == "True"
于 2019-08-08T11:53:05.777 回答
1

由于 Django 1.5 放弃了对 Python 2.5 的支持,django.utils.simplejson不再是 Django 的一部分,因为您可以改用 Python 的内置 json,它具有相同的 API:

import json

def view_function(request):
    json_boolean_to_python_boolean = json.loads(request.POST.get('json_field'))
于 2018-05-03T08:54:59.297 回答
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 回答
0

您只能将字符串“true”或“false”传递给布尔值

isUpvote = request.POST.get('isUpvote') == 'true'
于 2020-04-11T01:05:48.553 回答
0

使用 Python 的三元运算符

isUpvote = True if request.POST.get("isUpvote") == "true" else False

另外我应该提到,如果您正在使用 Django 的表单并尝试通过 Ajax 将兼容的布尔值传递给FormorModelForm类,则需要使用 Django 期望的精确值。

假设null=True您的模型:

  1. 未知
  2. 是的)
  3. 否(错误)

因此,例如,以下将正确地将布尔数据传递给 Django 的表单:

<input type="radio" id="radio1" name="response" value="2">
<label for="radio1">Yes</label>
<input type="radio" id="radio2" name="response" value="3">
<label for="radio2">No</label>
于 2017-07-10T23:52:18.017 回答