1

我想运行两个具有相同 url 模式的应用程序。我想避免使用特定于应用程序的 slug,例如 domain.com/pages/something-here 或 domain.com/blog/something-there。

我试过这个:

# urls.py
urlpatterns = patterns('',
    url(r'^$', 'my.homepage.view'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('pages.urls')),
    url(r'^', include('blog.urls')),
)

# pages/urls.py
urlpatterns = patterns('',
    url(r'^(.+)/$', views.page),
)

# blog/urls.py
urlpatterns = patterns('',
    url(r'^(.+)/$', views.post),
)

我的代码不起作用,无论哪个先出现(此处为 pages.urls)都可以,其他 url(用于博客)抛出 404。

提前致谢

编辑:我是这样做的:在与 settings.py 相同的目录中创建了glue.py。它将处理我的主页和这个调度程序视图:

def dispatcher(request, slug):
    try:
        page = get_object_or_404(Page, slug=slug)
        return render(request, 'pages/page.html', {'page': page})
    except:
        post = get_object_or_404(Post, slug=slug)
        return render(request, 'blog/post.html', {'post': post})

不知道行不行 我希望有更好的方法。

感谢您的评论。

4

3 回答 3

1

我不知道这是否是一个更好的答案。但是,如果您对这些情况感到满意..

  1. 如果您的 django 应用程序基于 django 模板渲染。

  2. 您正在谈论的 url 不需要通过在浏览器本身中键入端点来直接访问。

然后,也许您可​​以考虑 url 命名空间和模板重定向。

https://docs.djangoproject.com/en/1.11/topics/http/urls/#url-namespaces

于 2017-05-12T15:41:29.437 回答
0

这不起作用,因为 django url 是按顺序解析的,这意味着与正则表达式匹配的第一个 url 将是已解析的。在您的情况下,将永远不会搜索博客应用程序中包含的 url,因为 django 已经解析了页面上的 url 包含行。

此外,django url 模块不应该知道某个页面或博客文章是否存在,因为我相信在您的应用程序中,这是通过数据库查找确定的。

urls 模块只执行连接到第一个匹配的正则表达式的视图。

您应该更改您的逻辑,例如将“blog/”附加到博客网址(这有什么问题?)

   url(r'^blog/', include('blog.urls')),
   url(r'^', include('pages.urls')),

请注意,我将博客 url 向上移动,因为大多数通用 regxexp 应该始终是 django url 解析器尝试的最后一个。

或者,您可以编写一个代理视图来尝试博客文章和页面。但这对我来说似乎不是最好的方法。

于 2013-02-15T17:06:12.133 回答
-1

您希望它如何工作?他们都使用相同的 URL(这当然会导致问题)。用户如何访问“页面”而不是“博客”,反之亦然?

通常,您的 URL 模式中不能有重叠的 URL(不包括其他数据)。

编辑:

因此,您希望第一个应用程序检查它是否具有与 URL 匹配的视图,如果第一个应用程序没有,则下一步接管?你可以做一些复杂的事情,比如写一个“视图匹配器”来做你想做的事情,但是还有更直接的解决方案。

最简单的方法是更改slug​​您的一个应用程序的生成功能。让一个人使用除下划线以外的一些分隔符,或者总是将应用程序的名称附加到 slug 上。这样你就可以找到页面,因为它们的 url 是“some-slug-page”,而博客是“some-slug-blog”,然后你可以为其编写一个 URL 模式。如果您不想添加整个 URL,您可以仅附加/前置第一个字母,或任何您想要的。

只需考虑一种您可以接受的方式来为每个应用程序生成 URL,只需读取 URL,您就可以知道该页面属于哪个应用程序。

于 2013-02-15T16:33:13.713 回答