简体   繁体   中英

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 use sqLite instead of mysql I use django 1.4 .
  • I think tutorial was written before 1.4 released.

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:

终端中的错误消息

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)

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.

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.

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

for title not displaying in django admin panel

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM