0

This a relative import error that got me crazy. Here below is the directory tree and code:

books
├── admin.py
├── apps.py
├── forms.py
├── __init__.py
├── models.py
├── tests.py
├── urls.py
└── views.py

models.py

from django.db import models from django.core.urlresolvers import reverse

from . import views


class BookList(models.Model):
    cover = models.ImageField(upload_to='cover/%Y/%m/%d')
    # cover = models.CharField(max_length=200, blank=False)
    title = models.CharField(max_length=100, blank=False)
    author = models.CharField(max_length=50)
    publisher = models.CharField(max_length=50)
    review = models.TextField()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse(views.detail_book, kwargs={'id': self.id})

views.py (The code crashed at the line below pdb.set_trace())

import pdb

from django.views import generic
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

pdb.set_trace()
from .models import BookList
from .forms import BookListForm


class BookRecommend(generic.ListView):
    model = BookList
    template_name = 'books/books_list.html'
    context_object_name = 'books'
    paginate_by = 1


def add_book(request):
    if request.method == 'POST':
        form = BookListForm(request.POST)
        if form.is_valid():
            book = form.save()
            return HttpResponseRedirect(reverse(detail_book, kwargs={id: book.id}))
    else:
        form = BookListForm()
    return render(request, 'books/add_book.html', {'form': form})


def delete_book(request):
    pass


def modify_book(request):
    pass


def detail_book(request, id=1):
    book = get_object_or_404(BookList, id=id)
    return render(request, 'books/detail_book.html', {'book': book})

Trace back:

Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0xb621a2fc>
Traceback (most recent call last):
  File "/home/michael/Envs/DJ19/lib/python3.5/site-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/home/michael/Envs/DJ19/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run
    autoreload.raise_last_exception()
  File "/home/michael/Envs/DJ19/lib/python3.5/site-packages/django/utils/autoreload.py", line 249, in raise_last_exception
    six.reraise(*_exception)
  File "/home/michael/Envs/DJ19/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/home/michael/Envs/DJ19/lib/python3.5/site-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/home/michael/Envs/DJ19/lib/python3.5/site-packages/django/__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/michael/Envs/DJ19/lib/python3.5/site-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "/home/michael/Envs/DJ19/lib/python3.5/site-packages/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)
  File "/home/michael/Envs/DJ19/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/home/michael/Envs/DJ19/Profile/books/models.py", line 4, in <module>
    from . import views
  File "/home/michael/Envs/DJ19/Profile/books/views.py", line 9, in <module>
    from .models import BookList
ImportError: cannot import name 'BookList'

There no obstacle at the previous version before i add some view functions. Thanks in advance!

1Cr18Ni9
  • 1,737
  • 1
  • 12
  • 21
  • I myself get the problem again, ^_^ the problem is i cross import between views.py and models.py, but i still don't know why i can't; secondly, function reverse's first positional argument viewname could be a string-style funtion, so i don't need to import views. – 1Cr18Ni9 Oct 08 '16 at 02:45
  • See: http://stackoverflow.com/a/746067/4974980 – Jens Astrup Oct 08 '16 at 12:20

0 Answers0