6

I'm stuck in trying to create a simplest application with dajaxice. I'n read all topics about this problem here and not only here, rewrite all code many times, but still do not see what the problem is. the most interesting that, these examples are working (almost all): https://github.com/jorgebastida/django-dajaxice/downloads dajaxice-examples.tar.gz

But in my project i have this:

Uncaught TypeError: Cannot call method 'sayhello' of undefined 

my tools:

  • Windows 7 64
  • python-2.7.3
  • Django-1.4.2
  • django-dajaxice-0.2

project structure:

BlocalProject/
    templates/
        template_1.html
    manage.py
    BlocalProject/
        ajapp/
            __init__.py
            ajview.py
        __init__.py
        settings.py
        urls.py
        views.py
        wsgi.py

urls.py:

from django.conf.urls.defaults import *
import settings
from dajaxice.core import dajaxice_autodiscover
dajaxice_autodiscover()


urlpatterns = patterns('',
    (r'^%s/' % (settings.DAJAXICE_MEDIA_PREFIX), include('dajaxice.urls')),
    (r'^$', 'BlocalProject.views.start_page'),
)

views.py:

from django.shortcuts import render

def start_page(request):
    return render(request,'template_1.html')

ajapp.py:

from django.utils import simplejson
from dajaxice.core import dajaxice_functions


def sayhello(request):
    return simplejson.dumps({'message': 'Trololo!'})

dajaxice_functions.register(sayhello)

template_1.html:

{% load dajaxice_templatetags %}
<html>
  {% dajaxice_js_import %}
  <script>
    function alertMessage(data){
      alert(data.message);
      return false;
    }
  </script>

  <body>
    Some text
    <input type="button" value="Get!" onclick="Dajaxice.ajapp.sayhello(alertMessage);" />
  </body>
</html>

settings.py:

# Django settings for BlocalProject project.

DEBUG = True
TEMPLATE_DEBUG = DEBUG

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

MANAGERS = ADMINS

DATABASE_ENGINE = ''           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = ''             # Or path to database file if using sqlite3.
DATABASE_USER = ''             # Not used with sqlite3.
DATABASE_PASSWORD = ''         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_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.
# In a Windows environment this must be set to 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

# 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 = ''

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

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


# Make this unique, and don't share it with anybody.
SECRET_KEY = ')er9!%4v0=nmxd#2=j1*tlktmidq8aam2y)-%fjf6%^xp*5r)c'

# 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.load_template_source',
)

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

ROOT_URLCONF = 'BlocalProject.urls'

# Python dotted path to the WSGI application used by Django's runserver.
#WSGI_APPLICATION = 'BlocalProject.wsgi.application'

TEMPLATE_DIRS = (
    'D:/_/Site_test/Djpr/BlocalProject/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.
)

TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
                               "django.core.context_processors.debug",
                               "django.core.context_processors.i18n",
                               "django.core.context_processors.media",
                               "django.core.context_processors.static",
                               "django.core.context_processors.request",
                               "django.contrib.messages.context_processors.messages",)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'dajaxice',
    'BlocalProject.ajapp',  
)

DAJAXICE_MEDIA_PREFIX = "dajaxice"
DAJAXICE_DEBUG = True
DAJAXICE_JS_DOCSTRINGS = True
#DAJAXICE_NOTIFY_EXCEPTIONS = True

import logging
logging.basicConfig(level=logging.DEBUG)
kvadrat
  • 135
  • 2
  • 11
  • 1
    Is there a reason why you selected djaxice instead, when you could have used simply used javascript libraries to do it? – Raunak Agarwal Nov 26 '12 at 23:56
  • My knowledge in programming, especially in js, not high. This is just a hobby. My goal now - learn how to use Ajax in Django. It seemed to me that dajaxice easiest. Even if there is a simpler, i'd like to understand what is wrong with this example for a deeper understanding of general conception – kvadrat Nov 27 '12 at 05:56
  • Now i try this https://github.com/jorgebastida/django-dajaxice/tree/master/examples Same result. Uncaught TypeError: Cannot call method 'hello' of undefined – kvadrat Nov 28 '12 at 13:53
  • Why dont you use the decorator @dajaxice_register to register the sayhello view ? http://django-dajaxice.readthedocs.org/en/latest/quickstart.html – Bulkan Feb 10 '13 at 15:07
  • this is bat country we can't stop here. I stoped with Dajaxice. jQuery really is easier – kvadrat Feb 12 '13 at 04:33

1 Answers1

1

This might be too late, but...

IMHO, the dajaxice_autodiscover() doesn't actually get your method. I remember having a similar problem with another ajax lib and I've solved it by adding an import in the models.py (or views.py), which get imported when the app starts. The example you mention has an import in simple/views.py:

# Create your views here.
from django.shortcuts import render

# THIS ONE!
from dajaxice.core import dajaxice_functions
# ---------


def index(request):

    return render(request, 'simple/index.html')

which looks like it's initialising stuff. My approach would be:

  • put a couple of print statements in your ajapp.py and see if they get printed out.
  • create empty models.py and views.py in your BlocalProject.ajapp (does django still use models.py to validate a module as a django app?)

If your print statements don't get triggered, then you need to find out why. As I mentioned, it might be as simple as importing your ajax module in models :)

Laur Ivan
  • 4,117
  • 3
  • 38
  • 62