我想使用AJAX向同一个网址发送一个非常基本的帖子请求。它应该使用用户名并针对数据库进行检查,以查看是否已存在具有该名称的用户,并返回该字符串。发送请求的javascript函数有问题:
function usernameCheck(){
$.post("http://omnicloud.me/signup",
{username: $("#username").value},
function(response){
if(response=="true"){
$('#passAlert').innerHTML("Sorry, that username is already taken")
}
});
return !($('#passAlert').value == "Sorry, that username is already taken")
}
如果此人正在加载注册视图,则返回该页面,否则,将调用该页面以检查现有用户:
def signup(request):
if request.method == 'GET':
return render_to_response('signup.html', context_instance=RequestContext(request))
else:
#query db for user with username provided in POST, return if it exists
user = User.objects.get(username=request.POST["username"])
if user is not None:
return HttpResponse("true")
else:
return HttpResponse("false")
有没有什么可以看到为什么JS被忽略?萤火虫一无所获。
答案 0 :(得分:5)
Ajax的意思是“异步JavaScript和XML”,因此它不会等待$ .post完成,而只是在你的代码中继续。
要解决此问题,您必须使用回调函数:
http://api.jquery.com/jQuery.post/
jQuery.post(url [,data] [,success(data,textStatus,jqXHR)] [, dataType])
url包含发送请求的URL的字符串。
data使用请求发送到服务器的映射或字符串。
success(data,textStatus,jqXHR)执行的回调函数 如果请求成功。
dataType服务器所需的数据类型。默认: 智能猜测(xml,json,script或html)。
样品:
function usernameCheck(){
$.post("http://omnicloud.me/signup",
{username: $("#username").val()},
function(response){
if(response=="true"){
$('#passAlert').html("Sorry, that username is already taken")
}
});
}
您也可以传递匿名回调:
function usernameCheck(successCallback){
$.post("http://omnicloud.me/signup",
{username: $("#username").val()},
function(response){
if(response=="true") successCallback();
});
}
// Somewhere else in your code:
usernameCheck(function(){
$('#passAlert').html("Sorry, that username is already taken")
});
答案 1 :(得分:3)
首先,您的视图中存在一些问题。您需要检查POST是来自AJAX还是标准POST;否则,您将无法在以后实际添加用户。 (实际上AJAX部分应该是它自己的视图,因为它实际上不是注册过程本身的一部分,而是验证检查。后来,你可能真的想通过AJAX创建用户,你将无法做到因为视图无法区分两个不同的AJAX请求。)
接下来,当对象不存在时,get
不会返回None
;它引发ObjectDoesNotExist
例外。所以,你的if
声明不起作用;你必须使用try
块。
我已在下面更新了您的观点:
def signup(request):
if request.method == 'GET':
return render_to_response('signup.html', context_instance=RequestContext(request))
elif request.is_ajax():
# query db for user with username provided in POST, return if it exists
try:
user = User.objects.get(username=request.POST["username"])
except User.DoesNotExist:
return HttpResponse("false")
else:
return HttpResponse("true")
else:
# Normal post, add new user
答案 2 :(得分:-2)
编辑:确保响应发送回STRING true或STRING false
编辑:响应正在发送回STRING true或A STRING false
function usernameCheck(){
var exists;
$.post("http://omnicloud.me/signup", { username: $("#username").val() },
function(response){
exists = (response == 'true');
if(exists){
$('#passAlert').innHTML = "Sorry, that username is already taken";
return false;
} else {
return true;
}
});