本の詳細情報を表示するために、apphooksでdjango-cmsを使用しています。表示する本を指定するスラッグを受け入れるには、アプリフックのあるページが必要です。
「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テンプレートタグは1つの引数しか受け入れないため機能しません。そのため、表示する本を決定するために必要なスラッグを提供できません。
<a href="{% page_url 'book_detail' %}">go</a>
予想どおりhttp://localhost:8000/books/
、必要なスラッグが含まれていなかったため、これはエラーをスローするリダイレクトのみです。
get_absolute_url()
したがって、次のオプションは、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.urlsconfをメインのurlconfに含めると、機能します。したがって、URLがcms apphookによってのみ使用されている場合、djangoでは元に戻せないように見えます。
メインのURLにbooks.urlsを含めるのは汚い解決策のようで、テンプレートやget_absolute_url
関数にURLをハードコーディングしたくありません。これらのソリューションはどちらも「pythonesque」のようには見えません。
助言がありますか?
編集:
リバースは、言語の名前空間を使用する場合にのみ機能します。ドキュメントによると、言語の名前空間を指定する必要はありません。
>>> reverse('en:book_detail', args=[book.slug])