Django的。使用Jquery Validate和ajax确保用户名是唯一的

时间:2014-08-12 20:05:50

标签: javascript jquery ajax django jquery-validate

我想使用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'))

这不起作用,就像用户名字段包含错误一样,并且始终显示错误消息。

1 个答案:

答案 0 :(得分:4)

只需使用插件中包含的the remote method

  • 服务器端功能的URL是参数
  • 您无需指定data,因为默认情况下会发送字段的数据。
  • 您无需指定GET,因为它是默认方法。


$('#form_user').validate({
    rules: {
        nickname: {
            required: true,
            maxlength: 75,
            remote: "/profiles/check_nickname/"
        }
    },
    ....
});

当您希望验证通过时,/profiles/check_nickname/的服务器端功能必须echoreturn true。当您希望验证失败时,它必须是echoreturn false或JSON字符串。如果您使用它,JSON字符串将成为错误消息,否则将显示默认错误消息。

  

服务器端资源通过jQuery.ajax(XMLHttpRequest)和   获取与已验证的名称对应的键/值对   element及其值为GET参数。响应评估为   JSON,有效元素必须为true,可以为false,   使用默认消息,undefinednull表示无效元素;要么   一个字符串,例如。 "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}}等进行自定义。