使用Django进行Jquery表单验证

时间:2012-12-17 23:27:07

标签: javascript jquery django

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

我希望能够检查用户名或电子邮件地址是否已存在引发错误。但我想在不重新加载页面的情况下这样做,所以使用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;
  } 
 };

我认为这很复杂。有没有更简单的方法来实现这一目标?

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

很抱歉,但就安全性和效率而言,您的方法非常糟糕。您正在披露用户的所有用户名(无论是否隐藏输入)。您应该检查一些已构建的身份验证应用,例如django-usernea django-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')