Я получаю неописательное (или, по крайней мере, я не знаю, как интерпретировать в этом контексте) сообщение об ошибке при субклассировании из узла Django-Treebeard и не знаю, как отлаживать. Я использую инструкции по установке по адресу: http://code.tabo. pe/django-treebeard/src/tip/tbexample/ (см. в конце публикации).

Я создаю подкласс MP_Node, и syncdb работает. Однако загрузка кода models.py в оболочку приводит к ошибке «индекс списка вне допустимого диапазона» — см. код и трассировку ниже.

Спасибо за вашу помощь.

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. Добавьте слово "treebeard" в раздел INSTALLED_APPS вашего
файл настроек django.
3. Создайте новую модель, наследующую одну из моделей django-treebeard
. модели абстрактного дерева: mp_tree.MP_Node (материализованный путь),
ns_tree.NS_Node (вложенные наборы) или al_tree.AL_Node
(список смежности).
4. Запустите python manage.py syncdb

2
user265775 7 Фев 2010 в 03:45
Я также получаю ту же ошибку, когда каталог treebeard установлен не в django/contrib, а непосредственно в пакетах сайтов.
 – 
user265775
7 Фев 2010 в 04:06

2 ответа

У меня была такая же ошибка сегодня. Чтобы исправить это, сначала перейдите к файлу models.py, и в каждом из классов вы должны добавить еще один класс:

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

Я думаю, что вы получаете эту ошибку из-за точки в имени вашего приложения. Если имя приложения не указано в классе Meta, Django попытается определить его самостоятельно, разложив структуру папок. Когда это происходит, он разлагается в «местоположении периода» и определяет, что имя приложения будет medCE или delib в вашем случае, что, очевидно, не является именем вашего приложения.

Я знаю, что вопрос старый, но, надеюсь, он поможет будущим зрителям.

3
SaiyanGirl 11 Июл 2012 в 21:48

Вы можете просмотреть исходный код 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__.

2
nikola 19 Дек 2013 в 04:06
Спасибо за ваш ответ. Я видел комментарий app_label в каком-то блоге. Вот почему я переместил код treebeard в каталог django/contrib, а не просто в lib/site-packages. Я все еще получаю ту же ошибку. Я не понимаю, что app_label ищет и почему он не сможет его найти - я пытаюсь следовать самым основным инструкциям по установке и самому ванильному подклассу MP_Node, но, похоже, больше никто не сообщает Эта проблема.
 – 
user265775
7 Фев 2010 в 18:41
Мне не нужно каким-либо образом изменять код, но на случай, если я не получу другого ответа, можете ли вы уточнить свое предложение: для отладки этого вы можете просто изменить base.py, чтобы поймать IndexError и поднять model_module._name_ . Я новичок в Python и Django. Спасибо!
 – 
user265775
7 Фев 2010 в 18:42
Класс, в котором произошел сбой, был «встроенный». Я изменил код в соответствии с вашим предложением: напечатайте "base.ModelBase> model_module", model_module # debug try: one_up = model_module.__name__.split('.')[-2] кроме IndexError: one_up = "treebeard" kwargs = { "app_label": one_up} Теперь это работает, но я до сих пор не понимаю, почему ванильная установка на основе инструкций не работает - я думаю, что найду где-нибудь упоминание об этом.
 – 
user265775
7 Фев 2010 в 22:42