Подтвердить что ты не робот

Django-cms: URL-адреса, используемые apphooks, не работают с reverse() или {% url%}

Я использую django-cms с apphooks для отображения подробной информации о книге. Мне нужна страница с крючком приложения, чтобы принять пул, который указывает, какую книгу отображать.

Я создал страницу под названием "книги" и добавил апплет "BookDetailApp".

Вот что выглядит мой файл books.cms_app:

class BooksApp (CMSApp):
    name = _('Book Detail Page Application')
    urls = ['books.urls']

apphook_pool.register(BooksApp)

Вот то, что выглядит мои books.urls:

urlpatterns = patterns('',
    url(r'^(?P<slug>[\w\-]+)?', BookDetailView.as_view(), name='book_detail'),
)

И вот как выглядит мой файл books.views:

class BookDetailView (DetailView):
    model = Book
    template_name = 'layouts/book-detail.html'
    context_object_name = 'book'

Все это прекрасно работает, когда я перехожу непосредственно на страницу подробной книги. Поэтому переход к http://localhost:8000/books/the-book-slug/ работает точно так, как я хочу.

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

Использование тега шаблона page_url из django-cms не работает, потому что он принимает только один аргумент, поэтому я не могу предоставить пул, необходимый для определения отображаемой книги:

<a href="{% page_url 'book_detail' %}">go</a>

Как и ожидалось, это только перенаправляет на http://localhost:8000/books/, который выдает ошибку, потому что требуемый пул не был включен.

Итак, мои следующие параметры - использовать тег шаблона url или определять функцию get_absolute_url() на модели. Ни один из этих вариантов не работает:

<a href="{% url book_detail book.slug %}">go</a>

def get_absolute_url(self):
    return reverse('book_detail', args=[self.slug])

Это приводит к ошибке NoReverseMatch: Reverse for 'book_detail' not found.

Если я включу books.urls conf в мой основной URL-адрес, он будет работать. Таким образом, казалось бы, если URL-адрес используется только cms-apphook, он не может быть отменен django.

Включение books.urls в мои основные URL-адреса кажется грязным решением, и я определенно не хочу жестко кодировать URL-адреса в шаблоне или функцию get_absolute_url. Ни одно из этих решений не кажется очень "пифонесческим".

Любые предложения?

EDIT:

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

>>> reverse('en:book_detail', args=[book.slug])
4b9b3361

Ответ 1

Это, по-видимому, связано с тем, что наше приложение имеет cms.middleware.multilingual.MultilingualURLMiddleware, после чего все теги шаблона {% url %} и функция reverse() требуют пространства имен языка.

Поскольку наш сайт не локализован, удаление промежуточного программного обеспечения отлично работает. Документация не показалась мне такой ясной и, наконец, нашла ответ из другого источника.