【问题标题】:Exception when trying to install Django-Treebeard based on instructions尝试根据说明安装 Django-Treebeard 时出现异常
【发布时间】:2011-01-13 23:56:03
【问题描述】:

当我从 Django-Treebeard 节点进行子激光传输时,我收到了一个非描述性的(或者至少我不知道如何在这种情况下解释)错误消息,并且不确定如何调试。我正在使用安装说明:http://code.tabo.pe/django-treebeard/src/tip/tbexample/(请参阅帖子末尾)。

我创建了 MP_Node 的子类,并且 syncdb 工作。但是,将 models.py 代码加载到 shell 会产生“列表索引超出范围”错误 - 请参阅下面的代码和跟踪。

感谢您的帮助。

Python 2.6.4、Django 1.1、树须 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安装
PyPi 的最新 treebeard 版本
1.1。如果您不喜欢 easy_install,请从
下载一个版本 treebeard 下载页面或获取开发版
从treebeard mercurial存储库中运行
python setup.py install
2. 将“treebeard”添加到您
中的INSTALLED_APPS 部分 django 设置文件。
3. 创建一个继承自 django-treebeard 的一个新模型
抽象树模型:mp_tree.MP_Node(物化路径),
ns_tree.NS_Node(嵌套集)或 al_tree.AL_Node
(邻接列表)。
4.运行python manage.py syncdb

【问题讨论】:

  • 当 treebeard 目录没有安装在 django/contrib 下而是直接安装在 site-packages 下时,我也会遇到同样的错误。

标签: python django-treebeard


【解决方案1】:

您可以在线浏览 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__。

【讨论】:

  • 感谢您的回复。我看到 app_label 评论是一些博客。这就是为什么我将 treebeard 代码从最初只是在 lib/site-packages 下移动到 django/contrib 目录下的原因。我仍然遇到同样的错误。我不明白它在寻找什么 app_label 以及为什么它无法找到它 - 我正在尝试遵循最基本的安装说明和 MP_Node 的大多数香草子类,但似乎没有其他人在报告这个问题。
  • 我不需要以任何方式修改代码,但以防万一我没有得到另一个答案,您能否详细说明您的建议:要调试此问题,您只需修改 base.py 即可IndexError 并引发 model_module._name_。我是 Python 和 Django 的新手。谢谢!
  • 崩溃的类是“builtin”。我根据您的建议更改了代码: print "base.ModelBase> model_module", model_module # debug try: one_up = model_module.__name__.split('.')[-2] except IndexError: one_up = "treebeard" kwargs = { "app_label": one_up} 现在它可以工作了,但我仍然不知道为什么基于说明的香草安装不起作用 - 我想我会在某处找到一些提及它。
【解决方案2】:

我今天也犯了同样的错误。要修复你,首先转到你的 models.py 文件,在每个类中你必须添加另一个类:

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

我认为您收到此错误是因为您的应用名称中的句点。如果 Meta 类没有提供应用程序名称,Django 将尝试通过分解文件夹结构自己找出它。发生这种情况时,它会在“期间位置”分解,并在您的情况下计算出应用程序名称为 medCE 或 delib,这显然不是您的应用程序名称。

我知道这个问题很老了,但希望它能对未来的观众有所帮助

【讨论】: