2017-07-22 4 views
0

私は特定のurlからajax関数を呼び出し、それぞれのビュー関数を呼び出します。ビュー関数では、別のビューを呼び出すことでページをリダイレクトしたい(なぜなら、私はajaxリクエストの後にレンダリングできないからです)。ここでdjango.urls.exceptions.NoReverseMatch

は私のURLです:

@csrf_exempt 
def search_result(request): 
    keyword = request.POST.get('keyword') 
    selected = request.POST.get('selected') 
    url = reverse('new_search_result', 
        kwargs={'keyword': keyword, 
          'selected': selected}) 
    return HttpResponseRedirect(url) 
    # return render(request, 'SearchEngine/search_result.html', {'all_results': result}) 

そして、ここではnew_search_result図である:

def new_search_result(request, selected={}, keyword=''): 
    # code blocks 

は、しかし、領事に、私はこれを取得

urlpatterns = [ 
    url(r'^$', views.search, name='search'), 
    url(r'^search_result/.+$', views.search_result, name='search_result'), 
    url(r'^new_search_result/$', 
     views.new_search_result, 
     kwargs={'selected': '', 'keyword': ''}, 
     name='new_search_result') 
] 

そして、ここではsearch_result図でありますエラー:

django.urls.exceptions.NoReverseMatch: Reverse for 'new_search_result' with keyword arguments '{'selected': '{"PANTHER":"ftp.pantherdb.org","Pasteur Insitute":"ftp.pasteur.fr","Rat Genome Database":"ftp.rgd.mcw.edu"}', 'keyword': 'dfasdf'}' not found. 1 pattern(s) tried: ['searchengine/new_search_result/$'] 
[22/Jul/2017 12:52:12] "POST /searchengine/search_result/dfasdf HTTP/1.1" 500 16814 

答えて

0

あなたはurlへの呼び出しに提供し、余分なkwargs引数はあなたがしてビューに渡される追加パラメータを定義することができますurl

からkwargs引数。 reverseへの呼び出しでこれらの余分な引数が分からない場合、reverseの呼び出しはURLパターンで定義された引数のみを知っています。

あなたが持っているのであれば:値barで値1111yearfoo

urlpatterns = [ 
    url(r'^blog/(?P<year>[0-9]{4})/$', myview, 
     kwargs={'foo': 'bar'}), 
] 

をこれはblog/1111はその後、myviewは二つのパラメータで呼び出されるビューとして、あなたのURLがフェッチされるとことを意味しています。

ビューには、追加の引数fooが表示されます。これはURLにはなく、reverse機能には提供されていません。 reverse関数の引数kwargsは、実際にはurlパターンで定義された引数を参照します。

だから、あなたが達成しようとしているものを見ているビュー

にパラメータを渡す:あなたは別のURLにユーザーのブラウザをリダイレクトしたい、結果ビューはkeywordにアクセスする必要がありますようにとselectedパラメータ。

このデータをユーザーから隠すには、そのデータをセッションに保存する必要があります。これが当てはまらない場合は、ビューにパラメータを渡す3つの方法があります.GETパラメータ経由、POSTデータ経由、URLの表示です。別のページにリダイレクトしている場合、POSTリクエストを使用することはできません。あなたはURLを使うことができますが、検索ページにはGETパラメータを使うのが最善の選択肢だと思います。

あなたのsearch_resultビューでは、URLにクエリ文字列を追加できます。 ?keyword=...&selected=...。たとえば、次のように

import urllib 
@csrf_exempt 
def search_result(request): 
    args = { 
     'keyword': request.POST.get('keyword'), 
     'selected': request.POST.get('selected') 
    } 
    url = '%s?%s' % (
     reverse('new_search_result'), 
     urllib.urlencode(args) 
    ) 
    return HttpResponseRedirect(url) 

そして、あなたのnew_search_resultビューは、リクエストからのもの読んでいました:明確化のため

def new_search_result(request): 
    selected = request.GET.get('selected') 
    keyword = request.GET.get('keyword') 
    # ... 
+0

おかげで、私は別のビューにこれらの変数を渡すために、この場合に何をすべきでしょうか? – Mat

+0

@Mat私は、あなたがしようとしていることを達成できる方法を含めるように答えを更新しました。おそらく他の方法がありますし、ベストはあなたのやっていることの詳細に依存しますが、これが一般的にどのように達成されているかを示すのに十分です。 –