我正在使用带有 apphooks 的 django-cms 来显示图书详细信息。我需要带有应用程序挂钩的页面来接受指定要显示哪本书的 slug。
我创建了一个名为“books”的页面并添加了 apphook '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/
按照我想要的方式工作。
问题是我需要能够从主页上的促销链接到特定的书籍详细信息页面,并且没有任何预期的方法对我有用。
使用 django-cms 中的 page_url 模板标签不起作用,因为它只接受一个参数,所以我无法提供确定要显示哪本书所需的 slug:
<a href="{% page_url 'book_detail' %}">go</a>
正如预期的那样,这只会重定向到http://localhost:8000/books/
哪个引发错误,因为没有包含所需的 slug。
所以我的下一个选择是使用 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
错误。
如果我在我的主 url conf 中包含 books.urls conf,那么它就可以工作。因此,如果 url 仅由 cms apphook 使用,则 django 无法将其反转。
在我的主要 url 中包含 books.urls 似乎是一个肮脏的解决方案,我绝对不想在模板或get_absolute_url
函数中对 url 进行硬编码。这些解决方案都不是很“pythonesque”。
有什么建议么?
编辑:
仅当我使用语言命名空间时,反向才有效。根据文档指定语言命名空间不应该是必需的。
>>> reverse('en:book_detail', args=[book.slug])