2017-07-22 2 views
0

Ich rufe eine spezifische url von und ajax Funktion, die die jeweilige View-Funktion aufruft. In der View-Funktion möchte ich die Seite umleiten, indem ich eine andere Ansicht aufruft (weil ich nach einer Ajax-Anfrage nicht rendern kann).Django Reverse und Redirect nach Ajax-Anfrage zurück django.urls.exceptions.NoReverseMatch

Hier sind meine Urls:

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

Und hier ist die search_result Ansicht:

@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}) 

Und hier ist die new_search_result Ansicht:

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

Aber in Konsul erhalte ich diese Fehler:

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 

Antwort

0

Das kwargs Argument url

Das zusätzliche kwargs Argument Sie url dem Aufruf zur Verfügung stellen können Sie zusätzliche Parameter definieren, die auf die Ansicht dann übergeben werden. Sie definieren keine zusätzlichen Argumente, die beim Abrufen der URL bereitgestellt werden - der Aufruf an reverse kennt diese zusätzlichen Argumente nicht, der Aufruf an reverse kennt nur die im URL-Muster definierten Argumente.

Also, wenn Sie haben:

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

Dies bedeutet, dass, wenn Ihre URL abgerufen wird als blog/1111 dann sehen myview mit zwei Parametern aufgerufen wird: year mit Wert 1111 und foo mit Wert bar.

Nur die Ansicht sieht das zusätzliche Argument foo - es ist nicht in der URL, und es ist nicht zur reverse Funktion zur Verfügung gestellt. Das kwargs-Argument der reverse-Funktion bezieht sich tatsächlich auf die im URL-Muster definierten Argumente.

Parameter an eine Ansicht

So schauen, was Sie erreichen wollen: Sie wollen den Browser des Benutzers an eine andere URL umleiten, so dass die resultierende Ansicht Zugriff auf die keyword haben und selected Parameter.

Wenn Sie möchten, dass die Daten für den Benutzer ausgeblendet werden, müssen Sie sie in der Sitzung speichern. Vorausgesetzt, dies ist nicht der Fall, haben Sie drei Möglichkeiten, Parameter an eine Ansicht zu übergeben: über GET-Parameter, über POST-Daten und sehen Sie sich die URL an. In Ihrem Fall, wenn Sie auf eine andere Seite umleiten, können Sie keine POST-Anfrage verwenden. Du könntest die URL benutzen, aber für eine Suchseite würde ich denken, die beste Option wäre die Verwendung von GET-Parametern.

So in Ihrer search_result Ansicht können Sie eine Abfragezeichenfolge der URL hinzufügen dh. ?keyword=...&selected=....Zum Beispiel:

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) 

Und Ihre new_search_result Ansicht würde die aus der Anfrage lesen:

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

Dank für die Klärung, also was soll ich tun, in diesem Fall passiert diese Variablen zu einer anderen Ansicht? – Mat

+0

@Mat Ich habe die Antwort aktualisiert, um einen Weg einzuschließen, wie Sie erreichen könnten, was Sie versuchen zu tun. Es gibt wahrscheinlich andere Wege, und das Beste hängt von den Details ab, was Sie tun, aber hoffentlich reicht das, um Ihnen zu zeigen, wie dies im Allgemeinen erreicht wird. –

Verwandte Themen