0

在我的 django 应用程序中,我尝试使用 ajax 来检查用户名是否已经存在,如果是则显示错误。

这是我所拥有的

html:

 <form  method="post" id='my_form'>
 {% csrf_token %}
    <input id='username' type="text" name="username"/>
 <button type="submit">Valider</button>
 </form>

js:

  $('#my_form').submit(function(){
    var username = $('#username').val();
    if (username == ''){
       alert('please enter username');
       return false;
    }

    $.ajax({
           type: "POST",
           url: "/auth_validate",
           data: {'username': $('#username').val(), 'csrfmiddlewaretoken': '{{csrf_token}}'},
           dataType: "text",
           success: function(response) {
                  var response = $.parseJSON(response);
                  if (response.success){
                      return true;
                  }
                  else{
                      alert(response.error);
                      return false;
                  }
            },
            error: function(rs, e) {
                   alert(rs.responseText);
                   return false;
            }
      }); 
})

意见:

def auth_validate(request):
    error = ''
    success = False
    if request.method == 'POST':
        username = request.POST.get('username', None)
        if not username:
            error = _('Please enter username')
        elif User.objects.filter(username__exact=username).exists():
            error = _('Sorry this username is already taken')
        else:
            success = True

    ajax_vars = {'success': success, 'error': error}
    return HttpResponse(simplejson.dumps(ajax_vars), mimetype='application/javascript')

当我输入用户名(如果存在或不存在)时,会出现一个空警报,当我单击“确定”时,会提交表单。此外,错误不会出现。

知道为什么它不起作用吗?

谢谢您的帮助。

4

3 回答 3

2

您的视图和模板看起来不错我建议您使用本机JSON处理该函数并序列化表单而不是data手动“发送”。另外请注意return false事件回调的末尾,而不是successerror回调的内部。

$('#my_form').on('submit', function(){
    var $form = $(this);
    $.ajax({
        type: "POST",
        url: "/auth_validate",
        data: $form.serialize(),
        dataType: "json",
        success: function(response) {
            if (!response.success) {
                alert(response.error);
            } else {
                alert('This username is available!');
            }
        },
        error: function(rs, e) {
            alert(rs.responseText);
        }
    });
    return false;
});

祝你好运 :)

更新:

请检查成功回调中的 else ;)

于 2012-12-19T18:46:13.460 回答
1

因为这部分:

         var response = $.parseJSON(response);
          if (response.success){
              return true;
          }
          else{
              alert(response.error);
          }

响应没有值“成功”,因此会弹出一个警告对话框。jQuery 已经注意了,这个检查只在请求成功时进行,所以你不要这样做。

如果您不想使用 for 的浏览器提交,请在功能return false;末尾添加以防止浏览器默认行为。

于 2012-12-19T16:40:47.710 回答
0

django 响应的 JSON 是什么样的?

你知道哪个警报被调用了吗?是错误函数还是成功函数中的那个?

我认为你不需要这条线

var response = $.parseJSON(response);

响应应该已经是 JSON。

于 2012-12-19T16:40:24.080 回答