2012-12-17 36 views
0

在我的django应用程序中,我有一个表单,我要求用户输入电子邮件地址和用户名。与Django的Jquery表单验证

我希望能够检查用户名或电子邮件地址是否已经存在并引发错误。但我想这样做,而不重新加载我的网页,所以使用JavaScript或JQuery。

我的第一个想法是将是这样的(用户名):

HTML:

<form method="post" onsubmit="return validateForm();"> 
    {% csrf_token %} 

     <div id='error_message'></div> 
     <input class='username' type="text" name="username" value=""/> 

    <button type="submit">Valider</button> 

    </form> 

在我views.py:

def myview(request): 
     users = User.objects.all() 
     return render_to_response('mytemplate.html', 'users':users, context_instance=RequestContext(request)) 

然后在我的模板:

<div class='search'> 
    {% for user in users %} 
    <input type='hidden' value='{{user.username}}' 
    {% endfor %} 
    </div> 

然后,在js中:

function validateForm() { 
    var value = $('.username').val() 

    if(// find 'value' in all the <input type='hidden'> ) { 
    var error = 'Username already exists'; 
    $("#error_message").html(error); 
    return false; 
    } 
}; 

我觉得这很复杂。有一种更简单的方法来实现这一点吗?

感谢您的帮助。

+0

你可以把通过jQuery的Ajax调用,检查用户是否存在和视图可以使用用户名并将此结果返回到脚本。 – Jingo

回答

5

很抱歉,但是您的方法在安全性和效率方面非常糟糕。您正在披露用户的所有用户名(无论是否隐藏输入)。您应该检查一些已建成的身份验证的应用程序e.g django-userneadjango-allauth

我会去与AJAX验证:

首先给你的形式的ID例如my_form

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

     $.ajax({ 
       type: "POST", 
       url: "{% 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); 
         } 
       }, 
       error: function(rs, e) { 
         alert(rs.responseText); 
       } 
      }); 
    }) 
</script> 

urls.py添加auth_validate网址:

url(r'^auth_validate/$', 'myapp.views.auth_validate', name='auth_validate'), 

现在myapp.views

from django.http import HttpResponse 
from django.utils import simplejson 
from django.utils.translation import ugettext_lazy as _ 

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') 
+0

谢谢你的帮助。我会在第一部分中使用post方法。在我看来,我将不得不检查'用户名'是否已被使用。我没有得到的是我如何得到回应我的脚本(如果它正在使用或不)?我认为你的ajax请求的第二部分处理,但我不明白它的工作原理。你能给我一些解释吗? – Marcolac

+0

@Marcolac我已经添加完整的示例代码。我刚刚尝试验证用户名,但您可以使用类似的方式验证更多内容。希望这会有所帮助。 –

+0

非常感谢!它帮助我很多。 – Marcolac