12

本の詳細情報を表示するために、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])
4

1 に答える 1

8

これは明らかに、アプリケーションがすべてのテンプレート タグと関数に言語名前空間を要求するようにcms.middleware.multilingual.MultilingualURLMiddleware強制したことが原因でした。{% url %}reverse()

私たちのサイトはローカライズされていないため、ミドルウェアを削除してもうまくいきました。ドキュメントはこれについて私にはそれほど明確ではないようで、最終的に別の情報源から答えを見つけました。

于 2012-10-24T21:51:43.157 に答える