Search code examples
pythondjangodjango-tables2

django tables 'module' object has no attribute 'index'


I'm trying to use the django tables 2 tutorial (Link) and I'm stuck with this error.

Edit: this happens when I try to access 127.0.0.1:8000/tables/

I'm stuck at the this part in the tutorial: "Hook the view up in your URLs, and load the page, you should see:" It doesn’t display this table and instead shows the error displayed below.

I tried the solutions listed in the other questions, but it hasn't helped. Can someone help me please?

Here's the code: https://github.com/karbfg10k/temp-work/tree/master/IMedMonitor/IMed

And here's the error

Unhandled exception in thread started by <function wrapper at 0x7fa9216456e0>
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/runserver.py", line 116, in inner_run
    self.check(display_num_errors=True)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 426, in check
    include_deployment_checks=include_deployment_checks,
  File "/usr/local/lib/python2.7/dist-packages/django/core/checks/registry.py", line 75, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/usr/local/lib/python2.7/dist-packages/django/core/checks/urls.py", line 10, in check_url_config
    return check_resolver(resolver)
  File "/usr/local/lib/python2.7/dist-packages/django/core/checks/urls.py", line 19, in check_resolver
    for pattern in resolver.url_patterns:
  File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 33, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 417, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 33, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 410, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/karthik/Code/MedicalDevices/IMedMonitor/IMed/IMed/urls.py", line 20, in <module>
    url(r'^tables/', include('tables.urls')),
  File "/usr/local/lib/python2.7/dist-packages/django/conf/urls/__init__.py", line 52, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/karthik/Code/MedicalDevices/IMedMonitor/IMed/tables/urls.py", line 6, in <module>
    url(r'^$', views.index, name='index'),
AttributeError: 'module' object has no attribute 'index'

Solution

  • Uncomment the index method as Joel has stated and then render an html page as you have done in the people method, passing the table data as well.

    https://docs.djangoproject.com/en/1.9/intro/tutorial03/

    About 3/4 down the page (slightly modified to suit your example):

    def index(request):
        table_object = ......
        template = loader.get_template('correct_page_here')
        context = {
            'table_obj': table_object,
    }
        return HttpResponse(template.render(context, request))
    

    In the corresponding html page add the appropriate tags to render the table

    https://django-tables2.readthedocs.org/en/latest/pages/template-tags.html

    I changed your model files to this:

    from __future__ import unicode_literals
    
    from django.db import models
    
    data = [
        {"name": "Me!"},
        {"name": "Myself!"},
    ]
    
    # Create your models here.
    class Person(models.Model):
        name = models.CharField(verbose_name="full name", max_length = 20)
    

    After changing the model file make sure you run

    python manage.py makemigrations && python manage.py migrate
    

    Your tables/urls.py file to:

    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r'^$', views.index, name='index'),
        url(r'^people/$', views.people, name='people'),
    ]
    

    Your views.py file to:

    from django.shortcuts import render
    from django.http import HttpResponse
    from models import Person 
    
    
    def index(request):
        return HttpResponse("Hello, world. You're at the polls index.")
    
    
    def people(request):
        return render(request, "people.html", {"people": Person.objects.all()})
        table = Person(data)
    

    The installed apps in IMed/IMed/settings.py to:

    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'django_tables2',
        'IMed',
        'tables',
    ]
    

    Now if you run the server and go here:

    http://127.0.0.1:8000/tables/people/

    The people view will work and you can copy the same process in index as you have in people.