Reputation: 1416
I'm using Django 1.8 and Python 2.7.6 I had this Error: NameError: name 'BookAdmin' is not defined and this my code (models.py) in 'books' app.
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
st = models.CharField(max_length=50)
def __str__(self):
return self.name
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
def __str__(self):
return self.first_name
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
def __str__(self):
return self.title
and in admin.py
from django.contrib import admin
from books.models import Publisher, Author, Book
admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book, BookAdmin)
class BookAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['publication_date']}),
('Date infomation', {'fields': ['publisher']}),
]
Full error
Traceback (most recent call last): File "manage.py", line 10, in
<module>
execute_from_command_line(sys.argv) File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py",
line 338, in execute_from_command_line
utility.execute() File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py",
line 312, in execute
django.setup() File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 18,
in setup
apps.populate(settings.INSTALLED_APPS) File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line
115, in populate
app_config.ready() File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/apps.py",
line 22, in ready
self.module.autodiscover() File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/__init__.py",
line 24, in autodiscover
autodiscover_modules('admin', register_to=site) File "/usr/local/lib/python2.7/dist-packages/django/utils/module_loading.py",
line 74, in autodiscover_modules
import_module('%s.%s' % (app_config.name, module_to_search)) File "/usr/lib/python2.7/importlib/__init__.py", line 37, in
import_module
__import__(name) File "/home/thanhkhuebkdn/mysite/books/admin.py", line 8, in <module>
admin.site.register(Book, BookAdmin) NameError: name 'BookAdmin' is not defined
Upvotes: 0
Views: 2755
Reputation: 52203
You are trying to register BookAdmin
before actually creating it. Just move admin.site.register(Book, BookAdmin)
after the class definition and it will work as expected.
class BookAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['publication_date']}),
('Date infomation', {'fields': ['publisher']}),
]
admin.site.register(Book, BookAdmin)
Upvotes: 1
Reputation: 18966
It looks like you are trying to register BookAdmin
before it's definition. When the line admin.site.register(Book, BookAdmin)
runs, the class BookAdmin
hasn't been defined yet.
Re-arrange the code slightly so you have:
class BookAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['publication_date']}),
('Date infomation', {'fields': ['publisher']}),
]
admin.site.register(Book, BookAdmin)
Upvotes: 0