khue bui
khue bui

Reputation: 1416

NameError: name 'BookAdmin' is not defined ...Django

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

Answers (2)

Ozgur Vatansever
Ozgur Vatansever

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

johnharris85
johnharris85

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

Related Questions