我注意到当布尔数据从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“真实”值....
答案 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将兼容的布尔值传递给Form
或ModelForm
类,则需要使用Django期望的精确值
假设您的模型上有null=True
:
因此,例如,以下内容将正确地将布尔数据传递给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'