4

私の Django アプリでは、同じ jQuery リクエストで投稿して取得できるようにしたいと考えています。

私のHTML:

    <form  method="post" id='validation_form'>
    {% csrf_token %}
        <input id='username' type="text" name="username" value=""/>
        <button type="submit">Submit</button>
    </form>

JS:

   var username = $('#username').val()
   $.post('/auth_validate', {'username': username}, function(data) { 
   // Get Request to get something.
   }

ビュー:

   def auth_validate(request):
       error = False
       if request.method == 'POST':
           username = request.POST.get('username')

           if User.objects.filter(username__exact=username).exists():
               error = 'Sorry this username is already taken'

以前投稿したのと同じ jQuery リクエストで「エラー」を取得したいと思います。それは可能ですか?

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

編集:これが私が見つけた解決策です。

JS:

  function validateForm() {
    var username = $('#username').val()
    var result=''
    $.get('/auth_validate_username/', {'result':result}, function(data){
       $.post('/auth_validate_username/', {'username': username}, function(data) { 
       $('#error_message').html(data); 
      });
    });
    return false;
    };

html:

   <form  method="post" onsubmit="return validateForm();">
    {% csrf_token %}
        <input id='username' type="text" name="username" value=""/>
        <div id='error_message'></div>
        <button type="submit">Submit</button>
    </form>

ビュー:

    def auth_validate_username(request):
       result = ''
       if request.method == 'POST':
          username = request.POST.get('username')
          if User.objects.filter(username=username):
             result='Sorry but this name is already taken'

    return HttpResponse(result)

このようにして、最初にユーザー名の値を投稿します。ユーザー名が既に存在する場合は結果が変わり、それを取得します。

トリックは、get リクエスト内に post リクエストを入れることでした。

4

4 に答える 4

2

$.post を使用する代わりに、$.ajax コマンドを使用します。それらはまったく同じことを行いますが、$.ajax を使用すると、より多くの機能を使用できます。

$.ajax({
  type: 'POST',
  url: "/auth_validate",
  data: {
    'username': username
  },
  success: function(data){
    //There was successfully data here!
  },
  error: function(xhr, data, error){
    //An error was thrown!
  }
});

次に、この行のすぐ上に 403 (または同様の) HTTP エラー コードを返す行を追加します (私はそれを指定しますが、Django の詳細については詳しくありません)。

error = 'Sorry this username is already taken'

そうすれば、成功したメッセージは成功ハンドラーを介してルーティングされ、エラーはエラー ハンドラーを介してルーティングされます。

于 2012-12-19T15:43:00.037 に答える
1

getでメソッドを意味する場合GET、クエリを url パラメータに直接追加してみませんか?

  var username = $('#username').val()
   $.post('/auth_validate?myvar=thevalue', {'username': username}, function(data) { 
   // Get Request to get something.
   }

しかし、おそらく私は質問を誤解しています...

于 2012-12-19T15:43:10.613 に答える
0

httpコード400(Bad Request)を返し、リクエストのエラーハンドラーを追加すると、postうまくいくはずです。

私はdjangoにあまり詳しくないので、抽象的なアイデアを提供しているだけです。

于 2012-12-19T15:39:47.483 に答える
0

dajaxAPI を確認する必要があると思います。これでうまくいくでしょう。

于 2012-12-19T15:40:04.840 に答える