0

在我的 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;
  } 
 };

我认为这很复杂。有没有更简单的方法来做到这一点?

感谢您的帮助。

4

1 回答 1

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')
于 2012-12-17T23:44:20.277 回答