将布尔值从Javascript转换为Django?

时间:2013-08-12 01:55:28

标签: javascript jquery python ajax django

我注意到当布尔数据从javascript发送到Django视图时,它被传递为“true”/“false”(小写)而不是“True”/“False”(大写)。这会在我的应用程序中导致意外行为。例如:

vote.js

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

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

    return false;
});

views.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的“true / false”布尔值转换为Django的“True / False”值的最佳方法是什么?

谢谢!

ADDED :::::

好吧,我添加了一些'print'行来检查我的视图中是否出错:

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

    vote.save()

结果:

    True
    false    //lowercase

然后当我检查我的Django管理员时,它被保存为“True”!!! 所以我想这意味着,由于某种奇怪的原因,降低“假”值被保存为Django“真实”值....

11 个答案:

答案 0 :(得分:7)

可能更好的是拥有' isUpvote'值为字符串' true'或者' false'并使用json来区分其布尔值

import json

isUpvote = json.loads(request.POST.get('isUpvote', 'false')) # python boolean

答案 1 :(得分:4)

试试这个。

from django.utils import simplejson

def post(self, request, *args, **kwargs):
    isUpvote = simplejson.loads(request.POST.get('isUpvote'))

答案 2 :(得分:4)

我遇到了同样的问题(Javascript为true / false - Python需要True / False),但是使用一个小函数修复了它:

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

对某人可能有用。

答案 3 :(得分:3)

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

问题:

如果我将以下JSON发送到服务器,则布尔字段作为测试(" true"," false")并且我必须访问catalogues {{1 }}。此外,我无法轻松进行表单验证。

request.POST.getlist("catalogues[]")

Django请求处理程序:

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

$.post(url, data, doSomething);

解决方案

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

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

Django请求处理程序:

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

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

答案 4 :(得分:1)

转换为布尔值的Javascript方式是

//Your variable is the one you want to convert
var myBool = Boolean(yourVariable); 

但是在上面的代码中,您似乎传递的是字符串而不是此处的变量

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

你确定你做得对吗?

答案 5 :(得分:1)

另一种替代方法是使用ast(抽象语法树)库中的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

答案 6 :(得分:0)

使用Python的ternary operator

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

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

假设您的模型上有null=True

  1. 未知
  2. 是(真)
  3. 否(假)
  4. 因此,例如,以下内容将正确地将布尔数据传递给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>
    

答案 7 :(得分:0)

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

{{1}}

答案 8 :(得分:0)

我通常将JavaScript布尔值转换为数字。

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

在python中:

try:
  is_upvote = bool(int(request.POST.get('isUpvote', 0)))
except ValueError:
  // handle exception here

答案 9 :(得分:0)

从js调用django rest api时,我遇到了相同的问题,可以通过以下方式解决它:

localhost

答案 10 :(得分:0)

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

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