我使用django-cms和apphooks來顯示書籍詳細信息。我需要帶有應用程序鉤子的頁面才能接受指定要顯示哪本書的子彈。django-cms:apphooks使用的網址不能與reverse()或{%url%}配合使用
我創建了一個名爲'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模板標籤不起作用,因爲它只接受一個參數,所以我不能提供確定哪些書顯示所需要的毛坯:
<a href="{% page_url 'book_detail' %}">go</a>
正如所預期的這個只重定向到http://localhost:8000/books/
,由於不包含所需的slu thr,所以會引發錯誤。
所以我的下一個選擇是使用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中包含books.urls conf,那麼它可以工作。所以看起來,如果url只被一個cms apphook使用,它不能被django顛倒過來。
在我的主要網址中包含books.urls看起來像一個骯髒的解決方案,我絕對不想在模板或get_absolute_url
函數中對網址進行硬編碼。這些解決方案都不是很「pythonesque」。
有什麼建議嗎?
編輯:
逆向工程只有當我使用的語言命名空間。根據文檔指定語言命名空間不應該是必需的。
>>> reverse('en:book_detail', args=[book.slug])
我以前有同樣的問題。我認爲這是django-cms中的一個錯誤。據我記得,我實現了我自己的反向模板標籤,解決了這個問題,因爲我沒有足夠的時間來修復源代碼中的這個bug並創建請求。 這將是很好的報告和修復它。 –