Django + ajax waiting page, can not redirect to result page

1,719 views
Skip to first unread message

yun li

unread,
Dec 14, 2011, 3:31:03 AM12/14/11
to Django users
Hi all,
I have the problem for constructing waiting page using Django + ajax.
I followed instructions mentioned in the following link,
http://groups.google.com/group/django-users/browse_thread/thread/c1b0d916bbf86868.
However, when I run my program, it stops in http://127.0.0.1:8000/please_wait
and will not redirect to the result page like "http://127.0.0.1:8000/
display_DHM"

does anybody know what is going on?
I basically use the following instructions.

>>> >>> > # please_wait.html
>>> >>> > ...
>>> >>> > <script type="text/javascript"
>>> >>> > src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
>>> >>> > <script type="text/javascript">
>>> >>> > $.get('{% url run_DHM %}', function(data) {
>>> >>> > if (data == 'OK') {
>>> >>> > window.location.href = '{% url display_DHM %}';
>>> >>> > } else {
>>> >>> > alert(data);
>>> >>> > }
>>> >>> > });
>>> >>> > </script>
>>> >>> > Note I've used the shorthand urls above, you could just use
>>> >>> > '/run_DHM/'
>>> >>> > and
>>> >>> > '/display_DHM/' instead of the url template tags. You could also use
>>> >>> > the
>>> >>> > full package path. Also note that the callback function I refer to
>>> >>> > is
>>> >>> > defined inline - the function(data) ... part.
>>> >>> > # views.py
>>> >>> > from django.http import HttpResponse
>>> >>> > def please_wait(request):
>>> >>> > return render_to_response('please_wait.html', ...)
>>> >>> > def run_DHM(request):
>>> >>> > # Do calculations, store results in request.session
>>> >>> > ...
>>> >>> > # If everything ok, return OK (otherwise return some error)
>>> >>> > return HttpResponse('OK')
>>> >>> > def display_DHM(request):
>>> >>> > # Get results from session
>>> >>> > return render_to_response('ran_DHM.html', ...)


Thanks,
trace

yun li

unread,
Dec 14, 2011, 2:23:53 PM12/14/11
to Django users
Hi,
Does anyone can help?
Here are all contents in my files, I tried variable ways, but when I
submit a form, it only return the please_wait page and then stay there
forever. There is no redirect happened.
Since I want to check if it works first, there is no actual
calculation in the code.


######### url.py ################
urlpatterns = patterns('',
(r'^test$',views.test_form),
(r'^please_wait', views.please_wait),
url(r'^run_DHM$', views.run_DHM, name="run_DHM") ,
url(r'^displayDHM', views.display_DHM, name="displayDHM")
)


########### view.py #############
def test_form(request):
return render_to_response('test.html')

def please_wait(request):
return render_to_response('please_wait.html')

def run_DHM(request):
### lengthy calculations... ...
return HttpResponse("OK")

def display_DHM(request):
return render_to_response('display_DHM.html')

########## test.html ###########
{% extends "baseFrame.html" %}

{% block maincontent %}
<form method="POST" action="please_wait">
<p>Test:</p>
<div id="address"></div>
<p>Type your value in here:</p>
<p><textarea name="order" rows="6" cols="50" id="order"></
textarea></p>
<p><input type="submit" value="submit" id="submit" /></p>
</form>
{% endblock %}


########### please_wait.html ##########

<html>Please wait
<script type="text/javascript" src="http://code.jquery.com/
jquery-1.7.1.min.js">
$.getJSON('{% url run_DHM %}', function(data) {


if (data == 'OK') {

window.location.href = '{% url displayDHM %}';
} else {
alert(data);
}
});
</script>
</html>


########### display_DHM.html #########
<HTML>
<BODY>END FINALLY!</BODY>
</HTML>

Brett Epps

unread,
Dec 14, 2011, 4:47:02 PM12/14/11
to django...@googlegroups.com
I think the problem is that your <script> tag is incorrect. You're using
the same one to load jQuery and to add your code, so your JavaScript is
not getting run. The file "please_wait.html" should look like this:

<!DOCTYPE html>
<html>
<head>
<title>Please wait.</title>
<meta charset="utf-8">
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script>
$(function() {


$.getJSON('{% url run_DHM %}', function(data) {
if (data == 'OK') {
window.location.href = '{% url displayDHM %}';
} else {
alert(data);
}
});

});
</script>
</head>
<body>
<p>Please wait.</p>
</body>
</html>

I've also added a bit more to the HTML file so that it is more
standards-compliant.

Brett

>--
>You received this message because you are subscribed to the Google Groups
>"Django users" group.
>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.
>

yun li

unread,
Dec 14, 2011, 5:03:30 PM12/14/11
to Django users
But it still cannot work. when I submit something, it goes to the
please_wait page showing "please wait" and then nothing happened. I
really have no knowledge on ajax, so is there something I need to
install or import in my projects? and how can I test if codes in
<script> ...</script> really invoked?

Thanks,

Brett Epps

unread,
Dec 15, 2011, 11:57:30 AM12/15/11
to django...@googlegroups.com
I think the problem might be that you're using the getJSON function, which
expects a JSON response, but your view returns 'OK', which is not valid
JSON. The callback you have given to getJSON only gets called on "success"
(meaning a JSON document was retrieved) - that's why nothing is happening
for you right now. Try changing the return value from the view to a string
containing:

{"ok": true}

And then change this line in the JavaScript:

if (data == 'OK') {

to:

if (data.ok) {

I think it should work with those changes. If it doesn't, try checking the
JavaScript console in your browser for any errors.

Brett

yun li

unread,
Dec 15, 2011, 11:24:38 PM12/15/11
to Django users
Since I am really know nothing about ajax, I am not sure if I
understand "try changing the return value from the view to a string "
the right way. I changed the definition of run_DHM this way

def run_DHM(request):
xx = {'ok':true}
return(xx)

but still the same as before.

and how I can check if there is any error in JavaScript console in my
browser ?


On 12月15日, 上午8时57分, Brett Epps <Brett.E...@quest.com> wrote:
> I think the problem might be that you're using the getJSON function, which
> expects a JSON response, but your view returns 'OK', which is not valid
> JSON. The callback you have given to getJSON only gets called on "success"
> (meaning a JSON document was retrieved) - that's why nothing is happening
> for you right now. Try changing the return value from the view to a string
> containing:
>
> {"ok": true}
>
> And then change this line in the JavaScript:
>
> if (data == 'OK') {
>
> to:
>
> if (data.ok) {
>
> I think it should work with those changes. If it doesn't, try checking the
> JavaScript console in your browser for any errors.
>
> Brett
>

Denis Darii

unread,
Dec 16, 2011, 3:25:01 AM12/16/11
to django...@googlegroups.com
You can view your js errors by pressing CTRL+SWIFT+J in Firefox but i highly recommend you to install Firebug addon which allow you to view also the received data from your ajax request.
This e-mail and any file transmitted with it is intended only for the person or entity to which is addressed and may contain information that is privileged, confidential or otherwise protected from disclosure. Copying, dissemination or use of this e-mail or the information herein by anyone other than the intended recipient is prohibited. If you are not the intended recipient, please notify the sender immediately by return e-mail, delete this communication and destroy all copies.

yun li

unread,
Dec 16, 2011, 12:50:56 PM12/16/11
to django...@googlegroups.com
I will try it

yun li

unread,
Dec 16, 2011, 6:18:09 PM12/16/11
to Django users
thanks for Denis' suggestion, I can see errors now. looks like there
is an AttributeError. here is the error information:

###################################
AttributeError at /run_DHM

'dict' object has no attribute 'status_code'

Request Method: GET
Request URL: http://127.0.0.1:8000/run_DHM
Django Version: 1.3.1
Exception Type: AttributeError
Exception Value:

'dict' object has no attribute 'status_code'
###################################

and here are all current codes.
--------------------------------------------------------
urls.py---------------------------------------------------------------------
import mytest.views as views
from django.shortcuts import render_to_response
from django.conf.urls.defaults import patterns, include, url

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
(r'^test$',views.test_form),
(r'^please_wait', views.please_wait),
url(r'^run_DHM$', views.run_DHM, name="run_DHM") ,
url(r'^displayDHM', views.display_DHM, name="displayDHM")
)


---------------------------------------------------------------------
views.py---------------------------------------------------------------------
from django.shortcuts import render_to_response
from django.core.context_processors import csrf
from django.http import HttpResponse

def test_form(request):
c = {}
c.update(csrf(request))
return render_to_response('test.html',c)

def please_wait(request):
return render_to_response('please_wait.html')

def run_DHM(request):
xx = {'ok':'TRUE'}
#return HttpResponse("OK")
return xx

def display_DHM(request):
return render_to_response('display_DHM.html')


---------------------------------------------------------------------
please_wait.html---------------------------------------------------------------------


<!DOCTYPE html>
<html>
<head>
<title>Please wait.</title>
<meta charset="utf-8">
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></
script>
<script>
$(function() {
$.getJSON('{% url run_DHM %}', function(data) {

if (data.ok) {


window.location.href = '{% url displayDHM %}';
} else {
alert(data);
}
});
});
</script>
</head>
<body>
<p>Please wait.</p>
</body>
</html>


---------------------------------------------------------------------
test.html---------------------------------------------------------------------

<html>
<body>
<form method="POST" action="please_wait">{% csrf_token %}


<p>Test:</p>
<div id="address"></div>
<p>Type your value in here:</p>
<p><textarea name="order" rows="6" cols="50" id="order"></textarea></
p>
<p><input type="submit" value="submit" id="submit" /></p>
</form>

</body>
</html>


---------------------------------------------------------------------
display_DHM.html---------------------------------------------------------------------


<HTML>
<BODY>END FINALLY!</BODY>
</HTML>

#######################settings.py
# Django settings for mytest project.

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
# ('Your Name', 'your_...@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2',
'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '', # Or path to database file if
using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for
localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for
default. Not used with sqlite3.
}
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as
your
# system time zone.
TIME_ZONE = 'America/Chicago'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as
not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Absolute filesystem path to the directory that will hold user-
uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = ''

# URL that handles the media served from MEDIA_ROOT. Make sure to use
a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/
media/"
MEDIA_URL = ''

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static
files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = ''

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# URL prefix for admin static files -- CSS, JavaScript and images.
# Make sure to use a trailing slash.
# Examples: "http://foo.com/static/admin/", "/static/admin/".
ADMIN_MEDIA_PREFIX = '/static/admin/'

# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/
static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = 'mpizo)=nw5%bzy3@pp_)^%o1&+)_=$m^ai0wqtse&=e06b5=0z'

# List of callables that know how to import templates from various
sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)

ROOT_URLCONF = 'mytest.urls'

TEMPLATE_DIRS = (
'C:/Users/yun/tmp/mytest/templates'
# Put strings here, like "/home/html/django_templates" or "C:/www/
django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}

Brett Epps

unread,
Dec 19, 2011, 11:47:22 AM12/19/11
to django...@googlegroups.com
Change this:

def run_DHM(request):
xx = {'ok':'TRUE'}
#return HttpResponse("OK")
return xx

To this:

def run_DHM(request):
return HttpResponse("{'ok': true}")

You were getting that error because views should always return
HttpResponse objects.


Brett

Reply all
Reply to author
Forward
0 new messages