2017-08-29 33 views
0

フロントエンドからDjangoアプリケーションにいくつかの値を送信しようとしています。これらの値を操作して別のビューにリダイレクトしたいのですが、Djangoは何もリダイレクトもレンダリングもしていないようです。DjangoはPOSTリクエストを受け取った後リダイレクトしません

これは私urls.py

from django.conf.urls import url 
from . import settings 
from personality_form import views 

urlpatterns = [ 
    url(r'^$', views.home, name="home"), 
    url(r'^apiLogin/(?P<_id>\d+)$', views.apiLogin,name="apiLogin"), 
    url(r'^formulario/(?P<_id>\d+)$', views.formulario, name="formulario"), 
] 

ですこれは私のviews.py

from django.shortcuts import render, redirect 
from personality_form.models import * 
from personality_form.forms import * 
from django.views.decorators.csrf import csrf_exempt 

def home(request): 
    return render(request, 'index.html') 

def formulario(request, _id): 
    if (request.method == 'POST'): 
     form = personalityForm(request.POST) 
    else: 
     form = personalityForm() 

    return render(request, 'formulario.html', {'form': form}) 

@csrf_exempt 
def apiLogin(request, _id): 
    if (request.method == 'POST'):   
     return redirect('/formulario/'+_id) 

であり、これは私が前からPOSTリクエストを送信するために使用しているjavascript関数です。

function test() { 
      var http = new XMLHttpRequest(); 
      http.open('POST', '/apiLogin/1234', true); 
      http.setRequestHeader('Content-type', 'application/json'); 
      var payload = {userID: "1234", access: "4567"}; 
      var params = JSON.stringify(payload); 

      // Send request 
      http.send(params); 
     } 

POSTをapiLoginビューに送信しようとしました。私はそれがそのビューに入っていることを確認しますが、私はformularioビューにリダイレクトしようとすると、formularioコードに入りますが、render命令を実行していないようです。レンダリングのリダイレクト機能を変更しようとしましたが、新しいhtmlも表示しません。

URLをリダイレクトして正面を変更しない理由はありますか?

私はDjango 1.11とPython 3.6を使用しています。

+1

エラーまたはスタックトレースが表示されますか。 –

+0

いいえPOSTは "POST/apiLogin/1234 HTTP/1.1" 302を返します。その後、 'formulario'ビューからコードを実行していますが、レンダリング命令を無視してURLを変更しないようです。 –

+0

私は、コードをテストするためにJavaScript関数を使用していますか?それは正しくURLにリダイレクトされていますが、javascriptはそのリダイレクト命令で何もしていません。 –

答えて

0

コードを少し変更する必要があります。 api_login()に、逆引きURLを引数で作成します。 JavaScriptの内部では、リダイレクトするためにウィンドウ自体を変更します。

まず、内部のあなたのdef apiLogin(request, _id)

from django.core.urlresolvers import reverse 
from django.http import JsonResponse 

@csrf_exempt 
def apiLogin(request, _id): 
    if (request.method == 'POST'):   
     #create a url string using reverse. 
     url = reverse('formulario' , kwargs = {'_id' : _id}) 
     #if the above way doesn't work then try: url = request.build_absolute_uri(reverse('formulario' , kwargs = {'_id' : _id})) 
     #Now simply return a JsonResponse. Ideally while dealing with ajax, Json is preferred. 
     return JsonResponse(status = 302 , data = {'success' : url }) 

次に、あなたのJavaScript内:

function test() { 
    var http = new XMLHttpRequest(); 
    //The onreadystatechange function is called every time the readyState changes. 
    //4: request finished and response is ready 
    //basically the below function gets called every time your the response of you request request is returned from the server. 
    http.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 302) { 
      var json = JSON.parse(this.responseText); 
      console.log(json.success); 
      //following line would actually change the url of your window. 
      window.location.href = json.success; 
     } 
    }; 
    http.open('POST', '/apiLogin/1234', true); 
    http.setRequestHeader('Content-type', 'application/json'); 
    var payload = {userID: "1234", access: "4567"}; 
    var params = JSON.stringify(payload); 

    // Send request 
    http.send(params);  
} 

私はこの作品を願っています。そうでない場合は、コンソールの中に何が印刷されているかを確認してください。動作している場合は、単にコンソール文を削除してください。

これが役に立ちます。ありがとう。

+0

ありがとう!これはうまくいきましたが、javascriptのステータスコードを変更する必要がありました。なぜなら、views.pyに302を、JavaScript関数に301を入れたからです。あなたの答えを編集してください。私はそれを受け入れます。 –

+0

@MaríaVictoriaはタイプミスをお詫び申し上げます。あなたは正しいです。両方のコードスニペットのステータス302である必要があります。 301は、この場合ではない永久リダイレクトのためのものです。 –

関連する問題