按照说明安装Django-Treebeard时出现异常

2 投票
2 回答
2476 浏览
提问于 2025-04-15 18:59

我在从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 个回答

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__。

3

我今天也遇到了同样的错误。要解决这个问题,首先你需要打开你的 models.py 文件,然后在每个类里面添加一个新的类:

class Meta:
    app_label = 'app_name' # medCE.delib in your case

我觉得你会遇到这个错误是因为你的应用名称里有一个句点(.)。如果在 Meta 类里没有提供应用名称,Django 会试着自己找出这个名称,它会根据文件夹的结构来拆解。当它这样做的时候,就会在句点的位置拆解,结果把你的应用名称识别成了 medCE 或 delib,这显然不是你的应用名称。

我知道这个问题已经有点老了,但希望能帮助到将来的读者。

撰写回答