2012-06-26 53 views
12

我使用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]) 
+1

我以前有同樣的問題。我認爲這是django-cms中的一個錯誤。據我記得,我實現了我自己的反向模板標籤,解決了這個問題,因爲我沒有足夠的時間來修復源代碼中的這個bug並創建請求。 這將是很好的報告和修復它。 –

回答

8

這顯然是由於有cms.middleware.multilingual.MultilingualURLMiddleware我們的應用程序,然後迫使所有{% url %}模板標籤和reverse()功能要求的語言命名空間。

由於我們的網站沒有本地化,刪除中間件工作正常。這個文件對我來說似乎不太清楚,最後從另一個來源找到了答案。

+0

這是否有測試?該類似乎已從cms中間件中刪除,但我仍無法獲得{{url url} gallery_images'gallery_id = gallery.id%}'來反轉我的url模式url(r'^(?P \ d +)/ $','detail',name =「gallery_images」),' –

+2

從版本2.4開始似乎是固定的,請在升級之前閱讀文檔,您需要[遵循一些步驟](http:// docs。 django-cms.org/en/3.0.1/upgrade/2.4.html)。 –

相關問題