django-cms:apphooks使用的url不能与reverse()或{%url%}一起使用

Eri*_*ler 12 django url reverse content-management-system django-cms

我正在使用带有apphooks的django-cms来显示书籍详细信息.我需要带有app hook的页面来接受一个slug,它指定要显示的书.

我创建了一个名为"books"的页面,并添加了apphook'BookDetailApp'.

这是我的books.cms_app文件的样子:

class BooksApp (CMSApp):
    name = _('Book Detail Page Application')
    urls = ['books.urls']

apphook_pool.register(BooksApp)
Run Code Online (Sandbox Code Playgroud)

这是我的books.urls的样子:

urlpatterns = patterns('',
    url(r'^(?P<slug>[\w\-]+)?', BookDetailView.as_view(), name='book_detail'),
)
Run Code Online (Sandbox Code Playgroud)

这是我的books.views文件的样子:

class BookDetailView (DetailView):
    model = Book
    template_name = 'layouts/book-detail.html'
    context_object_name = 'book'
Run Code Online (Sandbox Code Playgroud)

当我直接进入预订详细信息页面时,一切正常.所以http://localhost:8000/books/the-book-slug/我的工作方式正是如此.

问题是我需要能够从主页上的促销链接到特定的书籍详细信息页面,并且没有任何预期的方法对我有用.

使用django-cms中的page_url模板标签不起作用,因为它只接受一个参数,所以我无法提供确定要显示哪本书所需的slug:

<a href="{% page_url 'book_detail' %}">go</a>
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这只重定向会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])
Run Code Online (Sandbox Code Playgroud)

这两者都会导致NoReverseMatch: Reverse for 'book_detail' not found错误.

如果我将books.urls conf包含在我的主url conf中,那么它可以工作.因此,如果网址只被cms apphook使用,它似乎无法被django逆转.

在我的主网址中包含books.urls似乎是一个肮脏的解决方案,我绝对不想硬编码模板或get_absolute_url函数中的网址.这些解决方案似乎都不是'pythonesque'.

有什么建议?

编辑:

仅当我使用语言命名空间时,反向才起作用.根据文档指定语言名称空间不应该是必需的.

>>> reverse('en:book_detail', args=[book.slug])
Run Code Online (Sandbox Code Playgroud)

Eri*_*ler 8

这显然是由于我们的应用程序cms.middleware.multilingual.MultilingualURLMiddleware然后强制所有{% url %}模板标签和reverse()函数需要语言命名空间.

由于我们的网站没有本地化,删除中间件工作正常.这篇文档对我来说似乎并不清楚,最后从另一个来源找到答案.

  • 它似乎是自2.4版本修复后,请在升级前阅读文档,你需要[按照一些步骤](http://docs.django-cms.org/en/3.0.1/upgrade/2.4.html)升级. (2认同)