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

ユーザー名を入力すると(存在するかどうかに関係なく)、空のアラートが表示され、[OK]をクリックするとフォームが送信されます。また、エラーは表示されません。

なぜそれが機能しないのかについて何か考えはありますか?

ご協力ありがとうございました。

4

3 に答える 3

2

ビューとテンプレートは正常に表示されます。手動JSONで「送信」するのではなく、関数が持つネイティブ処理を使用してフォームをシリアル化することをお勧めします。また、 andコールバック内ではなく、イベントコールバックの最後にあることにdata注意してください。return falsesuccesserror

$('#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);
          }

応答には「success」という値がないため、空のアラートダイアログがポップアップ表示されます。jQueryはすでに注意を払っており、このチェックはリクエストが成功した場合にのみ実行されるため、実行しないでください。

forのブラウザー送信を使用したくない場合は、return false;関数の最後に追加して、ブラウザーのデフォルトの動作を優先します。

于 2012-12-19T16:40:47.710 に答える
0

そのdjangoが応答しているJSONはどのように見えますか?

どのアラートが呼び出されているか知っていますか?エラー関数または成功関数のいずれかですか?

この行は必要ないと思います

var response = $.parseJSON(response);

応答はすでにJSONである必要があります。

于 2012-12-19T16:40:24.080 に答える