t1w
t1w

Reputation: 1428

Django Admin Interface doesn't Show App

I'm trying to follow this To-Do Application tutorial (link) with some tiny differences on my system

I have only one app as it's named in tutorial- todo. I'm trying to display app on django's admin interface but i can't manage to do that.

When i type python manage.py syncdb command on terminal, It gives me this error message:

error message in terminal

Below you can see my project's files.


models.py

# -*- coding: utf-8 -*-


from django.db import models
from django.contrib import admin
admin.autodiscover()

# Create your models here.

# For this application, we will need two models:
#                                              one representing a list,
#                                              and one representing an item in a list.


# this class will be a database table named list
class List(models.Model): 

  title = models.CharField(max_length=250, unique=True) 

  # __str__ method is like toString() in java
  def __str__(self): 

    return self.title 

  class Meta: 

    ordering = ['title'] 

  class Admin: 

    pass




# i need this for  Item Class    
import datetime 



PRIORITY_CHOICES = ( 

  (1, 'Low'), 

  (2, 'Normal'), 

  (3, 'High'), 

) 


# this class will be a database table named item
class Item(models.Model): 

  # this will create a charfield column named "title" in database
  title = models.CharField(max_length=250) 


  # created_date will be a DATETIME column in the database
  # datetime.datetime.now is a standard Python function
  created_date = models.DateTimeField(default=datetime.datetime.now) 


  # default priority level will be 2 as in "Normal" in PRIORITY_CHOICES
  # using choices argument as choices=PRIORITY_CHOICES , Django will allow only 1,2 and 3 as we want to
  priority = models.IntegerField(choices=PRIORITY_CHOICES, default=2) 


  # this will create a boolean column named "completed" in database
  completed = models.BooleanField(default=False)

  todo_list = models.ForeignKey(List) 

  def __str__(self): 

    return self.title 

  class Meta: 

    # We have specified that list items should be ordered by two columns: priority and title.
    # The - in front of priority tells Django to use descending order for the priority column,
    # so Django will include ORDER BY priority DESC title ASC in its queries whenever it deals with list items.
    ordering = ['-priority', 'title'] 

  class Admin: 

    pass

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/Users/ihtechnology/Desktop/envi/db_gtd/sqlite3.db', 
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      
        'PORT': '',                      
    }
}

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',
    # I ADDED MY APPLICATION HERE SO IN CAN BE INSTALLED INTO PROJECT AS OTHER DEFAULT DJANGO APPS
    'todo',
)

urls.py

from django.conf.urls import patterns, include, url

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

urlpatterns = patterns('',

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
)

admin.py

from todo.models import List
from todo.models import Item
from django.contrib import admin

admin.site.register(List)
admin.site.register(Item)

Upvotes: 1

Views: 1977

Answers (3)

Lyoid Lopes
Lyoid Lopes

Reputation: 1

from django.utils.encoding import smart_text 
def _str_(self) :
        return smart_text(self.title)

for title not displaying in django admin panel

Upvotes: 0

Omid Raha
Omid Raha

Reputation: 10688

It's caused for circular import issue:

+--> +/todo/models.py #line 6
|    |
|    +->**admin.autodiscover()**
|      +
|      |
|      +-->/django/contrib/admin/__init__.py #line 29
|         +
|         |
|         +->/django/utils/importlib.py # line 35
|           +
|           |
|           +-->/todo/admin.py #line 1
|           |
|           +->from todo.models import List
|           |
|           |
+-----------+

Your admin style is old, try new admin style.

Upvotes: 1

orokusaki
orokusaki

Reputation: 57198

The problem is that you're running admin.autodiscover() from within your models module, so the following happens during that call:

  1. Django looks for all admin modules in all installed apps, imports them
  2. Imports at the top of admin modules are of course run right when each admin is imported
  3. The admin module imports from todo.models import List (presumably)
  4. The todo.models module isn't available yet, because it was still being imported by load_app (6th frame from the bottom of your traceback) when admin.autodiscover() was run (3rd frame from the bottom of your traceback)

tl;dr

You just have a circular import, but I wanted to explain it so that it was clear why.

Solution

Move admin.autodiscover() to your main urls module.

Upvotes: 2

Related Questions