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])
Ответы
Ответ 1
Это, по-видимому, связано с тем, что наше приложение имеет cms.middleware.multilingual.MultilingualURLMiddleware
, после чего все теги шаблона {% url %}
и функция reverse()
требуют пространства имен языка.
Поскольку наш сайт не локализован, удаление промежуточного программного обеспечения отлично работает. Документация не показалась мне такой ясной и, наконец, нашла ответ из другого источника.