2017-10-13 4 views
0

Ich versuche ein Textfeld zu erstellen, das nach dem Eingeben eines Zeichens den Server abfragt.GET-Anfrage mit XHR-Objekt, URI-Komponentenname nicht gefunden

Ich erhalte den folgenden Fehler, und ich verstehe nicht, warum:

Traceback (most recent call last): 
    File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/utils/datastructures.py", line 83, in __getitem__ 
    list_ = super(MultiValueDict, self).__getitem__(key) 
KeyError: 'lift_string' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner 
    response = get_response(request) 
    File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/workout/workoutcal/views.py", line 71, in get_lifts 
    search_str = request.GET['lift_string'] 
    File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/utils/datastructures.py", line 85, in __getitem__ 
    raise MultiValueDictKeyError(repr(key)) 
django.utils.datastructures.MultiValueDictKeyError: "'lift_string'" 

ich es bekommen, wenn ich einen Charakter innerhalb dieses Textfeld eingeben:

<input id="lift" name="lift_string" type="text" onkeyup="getLifts()"> 

Diese ist die zugehörige Javascript des Textfeldes:

function addURLParam(url, name, value){ 
    url += (url.indexOf("?") == -1 ? "?" : "&"); 
    url += encodeURIComponent(name) + "=" + encodeURIComponent(value); 
    return url; 
} 

function getLifts(){ 

    var xhr = createXHR(); 
    xhr.onreadystatechange = function(){ 
     if (xhr.readyState == 4){ 
      if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){ 
       document.getElementById("xhrPar").innerHTML = xhr.responseText; 
      } else { 
       document.getElementById("xhrPar").innerHTML = "Request was unsuccessful: "+xhr.status; 
      } 
     } 
    }; 

    var url = "http://localhost:8000/workoutcal/get_lifts"; 
    addURLParam(url, document.getElementById("lift").name, document.getElementById("lift").value); 

    xhr.open("get", url, false); 
    xhr.send(null); 

} 

Und hier ist die Django Ansicht, dass der Griff get-Anfrage von dem XHR Objekt:

def get_lifts(request): 
    if request.method == 'GET': 
     search_str = request.GET['lift_string'] 
     return HttpResponse('Received lift_string') 

Es mir wie der Name lift_string URI-Komponente scheint, dass ich zu url in der Javascript hinzugefügt habe nicht gefunden werden kann? Warum?

EDIT: Der Inhalt des request.GET:

Hinzufügen von print-Anweisung zu lesen:

def get_lifts(request): 
    if request.method == 'GET': 
     print("CONTENT OF request.GET: "+str(request.GET)) 
     search_str = request.GET['lift_string'] 
     return HttpResponse('Received lift_string') 

führt zu dieser Ausgabe:

CONTENT OF request.GET: <QueryDict: {}> 
+0

Sind Sie sicher, dass nur die Ajax-Anfrage diese Ansicht trifft? Versuchen Sie auch, den Inhalt von 'request.GET' zu drucken. –

+0

1. Das ist, soweit ich sagen kann, die einzige Ajax-Anfrage in meiner gesamten Web-App. Es gibt kein anderes XHR-Objekt irgendwo anders in meinem ganzen Projekt. 2. Inhalte von request.GET in der Bearbeitung hinzugefügt. Es ist leer – Sahand

+0

(Ich meinte, könnte es eine Nicht-Ajax-Anfrage gewesen sein, die diese Ansicht trifft. Aber egal, Ivan hat die richtige Antwort hingewiesen.) –

Antwort

2

Sie haben vergessen, das Ergebnis der addURLParam-url zuweisen, so:

url = addURLParam(url, document.getElementById("lift").name, document.getElementById("lift").value); 
Verwandte Themen