Problem with Django and AJAX: Empty responsetext

133 views
Skip to first unread message

Schmidtchen Schleicher

unread,
Nov 21, 2011, 4:10:13 PM11/21/11
to django...@googlegroups.com
I'm trying to do a simple google-suggest like thing with django and ajax. I wrote a view for creating the response and try to use it via an XMLHttpRequest.
Here's my view:


def category_suggest(request):
    if request.method == "GET":
        return_categories = ''
        received_str = request.GET['str']
        found_categories = Category.objects.filter(name__istartswith=received_str) #i stands for incasesensitive
        if found_categories:
            for cat in found_categories:
                return_categories = return_categories + cat.name + "\n"
       
        print "returned str:"
        print return_categories
        return HttpResponse(str(return_categories), mimetype='text/plain')
    else:
        return HttpResponse('')
 
This view appears to work, because if I open the corresponding url in a browser the data is displayed.
But it doesn't work via ajax: this is the javascript code:

//Gets the browser specific XmlHttpRequest Object
function getXmlHttpRequestObject() {
    console.debug("GettingXMLHTTP");
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    } else if(window.ActiveXObject) {
        return new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        alert("Your Browser Sucks!\nIt's about time to upgrade don't you think?");
    }
}

//Our XmlHttpRequest object to get the auto suggest
var searchReq = getXmlHttpRequestObject();

//Called from keyup on the search textbox.
//Starts the AJAX request.
function searchSuggest() {
    if (searchReq.readyState == 4 || searchReq.readyState == 0) {
        console.debug("start suggest...");
        var str = escape(document.getElementById('txtSearch').value);
    searchReq.onreadystatechange = handleSearchSuggest;
    var myDate = new Date();
    var myTime = myDate.getTime();
    searchReq.open("GET", 'http://127.0.0.1:8000/kalender/ajax/category_suggest/?str=' + str + "&time=" + myTime, true);
        console.debug("sending");
        searchReq.send(null);
    }       
}

//Called when the AJAX response is returned.
function handleSearchSuggest() {
    console.debug("Handling suggest");
    if (searchReq.readyState == 4) {
        console.debug("ReadyState is 4");
        var ss = document.getElementById('search_suggest')
        ss.innerHTML = '';
        var rstr = searchReq.responseText.split("\n");
                console.debug("Response:"+JSON.stringify(searchReq));
        for(i=0; i < rstr.length - 1; i++) {
            //Build our element string.  This is cleaner using the DOM, but
            //IE doesn't support dynamically added attributes.
            var suggest = '<div ';
            suggest += 'onclick="javascript:setSearch(this.innerHTML);" ';
            suggest += 'class="suggest_link">' + rstr[i] + '</div>';
            ss.innerHTML += suggest;
        }
    }
}

//Click function
function setSearch(value) {
    document.getElementById('txtSearch').value = value;
    document.getElementById('search_suggest').innerHTML = '';
}

Every function is getting entered and firebug shows there's is a request sendet to the django view but the responsetext is an empty string although the django-view prints (for debugging purposes) the strings it should send to the console.
I've asked many people who are really fit in javascript and noone could find the error :( They told me it must be a django-related issue

So is it because of django and do You find the error?

Thanks
Schmidtchen

Furbee

unread,
Nov 21, 2011, 4:27:30 PM11/21/11
to django...@googlegroups.com
Disclaimer: I don't know if this is at all related, but I had an issue with an AJAX object I created outside a function. Can you try this and let me know if it works?

Change this:
var searchReq = getXmlHttpRequestObject();
to this:
searchReq = getXmlHttpRequestObject();

and move it into searchSuggest(), like:
function searchSuggest() {
    searchReq = getXmlHttpRequestObject();
    .
    .
    .
}

I can't explain this, but it tripped me up, because creating the AJAX object globally, outside a function, didn't seem to work. I read an explanation that made some sense, although it seemed like a bug, but it has been too long and I can't remember exactly what the problem was. Keep me posted.

Furbee

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To view this discussion on the web visit https://groups.google.com/d/msg/django-users/-/SmXwPWGtKnYJ.
To post to this group, send email to django...@googlegroups.com.
To unsubscribe from this group, send email to django-users...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

Reply all
Reply to author
Forward
0 new messages