我想使用jquery validate()来确保没有相同昵称的用户(或用户名,在我的模型中它被称为昵称,但它是相同的。)
模型字段如下所示:
nickname = models.CharField(max_length=75, unique=True, null=True)
我想使用ajax,这是javascript:
$.validator.addMethod("checkNickname", function(){
var nickname = $("#nickname").val();
if (nickname == ''){
return false
};
$.ajax({
type: "GET",
url: "/profiles/check_nickname/",
data: {'nickname':nickname},
success: function(response){
if (response == "True"){
return true
}
else {
$("#help_nickname").text("Nickname already exists")
return false
}
}
})
});
$('#form_user').validate({
rules: {
nickname: {
required: true,
maxlength: 75,
checkNickname: true,
}
},
errorElement: "span",
messages: {
...
});
并在views.py中:
def check_nickname(request):
if request.is_ajax():
nickname_new = request.GET.get('nickname', '')
if Profiles.objects.exclude(user=request.user).filter(nickname=nickname_new).exists():
return HttpResponse(False)
else:
return HttpResponse(True)
else:
return HttpResponseRedirect(reverse('profiles:login'))
这不起作用,就像用户名字段包含错误一样,并且始终显示错误消息。
答案 0 :(得分:4)
只需使用插件中包含的the remote
method。
data
,因为默认情况下会发送字段的数据。GET
,因为它是默认方法。
$('#form_user').validate({
rules: {
nickname: {
required: true,
maxlength: 75,
remote: "/profiles/check_nickname/"
}
},
....
});
当您希望验证通过时,/profiles/check_nickname/
的服务器端功能必须echo
或return
true
。当您希望验证失败时,它必须是echo
或return
false
或JSON字符串。如果您使用它,JSON字符串将成为错误消息,否则将显示默认错误消息。
服务器端资源通过
jQuery.ajax
(XMLHttpRequest)和 获取与已验证的名称对应的键/值对 element及其值为GET
参数。响应评估为JSON
,有效元素必须为true
,可以为false
, 使用默认消息,undefined
或null
表示无效元素;要么 一个字符串,例如。"That name is already taken, try peter123 instead"
来 显示为错误消息。
SIDE-NOTE回答您的自定义解决方案被破坏的原因:
引用OP:
"这不起作用,就像用户名字段包含错误一样,并且始终显示错误消息。"
那是因为你没有正确使用the addMethod()
method。通过将消息文本插入元素,您可以手动绕过插件自动创建的方式并显示错误消息。
自定义错误消息应该是第三个参数,在整个函数之后......
$.validator.addMethod("checkNickname", function(){ // 1st, NAME for method
// your validation function here // 2nd, LOGIC for method
}, "Nickname already exists"); // 3rd, ERROR MESSAGE for method
然后该插件将知道&何时自动切换消息。如果邮件位置错误,请使用errorPlacement
,例如errorElement
,{{1}}等进行自定义。