Расширение приложения Django CMS 2.1.0 NoReverseMatch TemplateSyntaxError

Я пишу собственное приложение для Django CMS, но получаю следующую ошибку при попытке просмотреть опубликованную запись в админке:

TemplateSyntaxError в /admin/cmsplugin_publisher/entry/

Обнаружен NoReverseMatch при рендеринге: Обратное для «cmsplugin_publisher_entry_detail» с аргументами «()» и аргументами ключевого слова «{'slug': u'test-german'}' не найдено.

Я могу заставить приложение работать, если я дам приложению URL-адрес в моем основном приложении urls.py, но это фиксирует приложение на требуемый URL-адрес, я просто хочу расширить Django CMS, чтобы приложение появлялось с любой страницы, на которую оно добавлено.

Шаблон абсолютного URL models.py

    @models.permalink
    def get_absolute_url(self):
        return ('cmsplugin_publisher_entry_detail', (), {
            'slug': self.slug})

urls/entries.py

from django.conf.urls.defaults import *
from cmsplugin_publisher.models import Entry
from cmsplugin_publisher.settings import PAGINATION, ALLOW_EMPTY, ALLOW_FUTURE

entry_conf_list = {'queryset': Entry.published.all(), 'paginate_by': PAGINATION,}

entry_conf = {'queryset': Entry.published.all(),
    'date_field': 'creation_date',
    'allow_empty': ALLOW_EMPTY,
    'allow_future': ALLOW_FUTURE,
}

entry_conf_detail = entry_conf.copy()
del entry_conf_detail['allow_empty']
del entry_conf_detail['allow_future']
del entry_conf_detail['date_field']
entry_conf_detail['queryset'] = Entry.objects.all()

urlpatterns = patterns('cmsplugin_publisher.views.entries',
    url(r'^$', 'entry_index', entry_conf_list,
        name='cmsplugin_publisher_entry_archive_index'),
    url(r'^(?P<page>[0-9]+)/$', 'entry_index', entry_conf_list,
        name='cmsplugin_publisher_entry_archive_index_paginated'),
)

urlpatterns += patterns('django.views.generic.list_detail',
    url(r'^(?P<slug>[-\w]+)/$', 'object_detail', entry_conf_detail,
        name='cmsplugin_publisher_entry_detail'),
)

views/entries.py

from django.views.generic.list_detail import object_list
from cmsplugin_publisher.models import Entry
from cmsplugin_publisher.views.decorators import update_queryset

entry_index = update_queryset(object_list, Entry.published.all)

views/decorators.py

def update_queryset(view, queryset, queryset_parameter='queryset'):
    '''Decorator around views based on a queryset passed in parameter which will force the update despite cache
    Related to issue http://code.djangoproject.com/ticket/8378'''

    def wrap(*args, **kwargs):
        '''Regenerate the queryset before passing it to the view.'''
        kwargs[queryset_parameter] = queryset()
        return view(*args, **kwargs)
    return wrap

Интеграция приложения с Django CMS объясняется здесь: http://github.com/divio/django-cms/blob/master/cms/docs/app_integration.txt

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

Py-файл расширения приложения CMS:

cms_app.py

from django.utils.translation import ugettext_lazy as _

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from cmsplugin_publisher.settings import APP_MENUS

class PublisherApp(CMSApp):
    name = _('Publisher App Hook')
    urls = ['cmsplugin_publisher.urls']

apphook_pool.register(PublisherApp)

Любые указатели приветствуются, это оказывается крепким орешком!


person Chris    schedule 07.08.2010    source источник


Ответы (3)


Похоже, это ошибка в парсере URLconf в Django-CMS 2.1.0beta3, которая исправлена. в разработке. Ошибка возникает только при включении других URL-конфигов из приложения.

person Jason Davies    schedule 12.08.2010
comment
Это исправило это отлично. Спасибо Джейсон! - person Chris; 12.08.2010

ОБНОВИТЬ:

Хорошо, я думаю, что ваша ошибка связана с get_absolute_url:

@models.permalink
def get_absolute_url(self):
    return ('cmsplugin_publisher_entry_detail', (), {'slug': self.slug})

Я подозреваю, что это в конечном итоге вызывает object_detail, который ожидает позиционный параметр queryset (см. django/views/generic/list_detail.py). Вы можете попробовать изменить это на что-то вроде:

    return ('cmsplugin_publisher_entry_detail', [Entry.objects.all(),], {'slug': self.slug})
person ars    schedule 07.08.2010
comment
Это не имеет значения: slug_field по умолчанию использует «slug», который является частью модели. - person Chris; 11.08.2010
comment
Вы правы, не заметил значение по умолчанию для slug_field .. Я обновил свой ответ. Надеюсь, это куда-нибудь попадет. - person ars; 11.08.2010
comment
Я думаю, что вы правы насчет элемента poisitional, но ваше редактирование вызывает: Caught ValueError при рендеринге: не смешивайте *args и **kwargs при вызове reverse()! Так что эта проблема должна быть где-то еще - person Chris; 12.08.2010
comment
Может быть, просто создайте функцию-оболочку для object_detail, которая принимает два позиционных параметра (Entry.objects.all и self.slug), которая затем вызывает object_detail. Укажите эту функцию-оболочку в get_absolute_url. Если это сработает, по крайней мере, вы будете знать, что находитесь на правильном пути. - person ars; 12.08.2010

Я бы еще раз проверил, действительно ли urls/entries.py куда-то импортируется, иначе он не сможет получить обратное совпадение.

person Jason Davies    schedule 11.08.2010
comment
Кажется, это не так, он находится в папке /urls/, импортируя записи.py через init.py в папку. Работает нормально, когда для приложения указан абсолютный URL-адрес на основном веб-сайте urls.py - хотя, конечно, я хочу расширить только URL-адреса django-cms, так что это не решение, которое я могу использовать. - person Chris; 12.08.2010