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>

URLurls.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 に答える