【问题标题】:django-cms: urls used by apphooks don't work with reverse() or {% url %}django-cms:apphooks 使用的 url 不适用于 reverse() 或 {% url %}
【发布时间】:2012-06-28 07:34:49
【问题描述】:

我正在使用带有 apphooks 的 django-cms 来显示图书详细信息。我需要带有 app 钩子的页面来接受指定要显示哪本书的 slug。

我创建了一个名为“books”的页面并添加了应用程序“BookDetailApp”。

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

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

apphook_pool.register(BooksApp)

这是我的 books.url 的样子:

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 模板标签不起作用,因为它只接受一个参数,所以我无法提供确定要显示哪本书所需的 slug:

<a href="{% page_url 'book_detail' %}">go</a>

正如预期的那样,这只会重定向到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])

这些都会导致NoReverseMatch: Reverse for 'book_detail' not found 错误。

如果我在我的主 url conf 中包含 books.urls conf,那么它就可以工作。因此,如果 url 仅由 cms apphook 使用,则 django 无法将其反转。

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

有什么建议吗?

编辑:

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

>>> reverse('en:book_detail', args=[book.slug])

【问题讨论】:

  • 前段时间我也遇到了同样的问题。我认为这是 django-cms 中的一个错误。据我所知,我实现了自己的反向模板标签来解决这个问题,因为我没有足够的时间来修复源代码中的这个错误并创建拉取请求。报告并修复它会很棒。

标签: django url content-management-system reverse django-cms


【解决方案1】:

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

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

【讨论】:

  • 这个有测试吗?该类似乎已从 cms 中间件中删除,但我仍然无法让 {% url 'gallery_images' gallery_id=gallery.id %} 反转我的 url 模式 url(r'^(?P&lt;gallery_id&gt;\d+)/$', 'detail', name="gallery_images"),
  • 好像从2.4版本开始修复,升级前请阅读文档,升级时需要follow some steps
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 2015-04-23
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多