按照说明安装Django-Treebeard时出现异常
我在从Django-Treebeard的节点类派生子类时遇到了一个不太好理解的错误信息(或者说我不知道在这个上下文中该怎么解读),现在不太确定该怎么调试。我按照这个链接的安装说明在操作:http://code.tabo.pe/django-treebeard/src/tip/tbexample/(具体内容在帖子末尾)。
我创建了一个MP_Node的子类,syncdb命令可以正常工作。但是,当我把models.py的代码加载到一个shell中时,却出现了“列表索引超出范围”的错误——下面是代码和错误追踪信息。
谢谢你的帮助。
Python 2.6.4,Django 1.1,Treebeard 1.1:
try:
from django.db import models, transaction
from django.db.models import AutoField
import django.dispatch
from django.contrib.treebeard.mp_tree import MP_Node
except ImportError, exc:
print "django error in %s: %s" % (__file__, exc)
class DelibNode(MP_Node): pass
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Program Files\Python26\lib\site-packages\django\db\models\base.py", line 52, in __new__
kwargs = {"app_label": model_module.__name__.split('.')[-2]}
IndexError: list index out of range
Settings.py中的已安装应用:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.s ites',
'django.contrib.admin',
'django.contrib.treebeard',
'medCE.delib'
)
安装说明:
1. 运行 easy_install django-treebeard
来安装最新的treebeard版本,来自PyPi
1.1。如果你不喜欢使用easy_install,可以从treebeard的下载页面下载一个发布版本,或者从treebeard的mercurial仓库获取开发版本,然后运行
python setup.py install
2. 在你的django设置文件中的 INSTALLED_APPS
部分添加'treebeard'。
3. 创建一个新的模型,继承自django-treebeard的一个抽象树模型:mp_tree.MP_Node(物化路径),
ns_tree.NS_Node(嵌套集合)或 al_tree.AL_Node
(邻接列表)。
4. 运行 python manage.py syncdb
2 个回答
你可以在线查看Django的源代码:
https://github.com/django/django/blob/master/django/db/models/base.py#L90
引发异常的相关代码有这样一个注释:
# Figure out the app_label by looking one level up.
# For 'django.contrib.sites.models', this would be 'sites'.
所以看起来这段代码是在尝试确定一个模型属于哪个应用。
要调试这个问题,你可以简单地修改base.py,捕获IndexError错误,并抛出model_module.__name__。
我今天也遇到了同样的错误。要解决这个问题,首先你需要打开你的 models.py 文件,然后在每个类里面添加一个新的类:
class Meta:
app_label = 'app_name' # medCE.delib in your case
我觉得你会遇到这个错误是因为你的应用名称里有一个句点(.)。如果在 Meta 类里没有提供应用名称,Django 会试着自己找出这个名称,它会根据文件夹的结构来拆解。当它这样做的时候,就会在句点的位置拆解,结果把你的应用名称识别成了 medCE 或 delib,这显然不是你的应用名称。
我知道这个问题已经有点老了,但希望能帮助到将来的读者。