【问题标题】:Django Identical URL Pattern in two Separate Apps Conflict两个单独的应用程序冲突中的 Django 相同的 URL 模式
【发布时间】:2017-06-04 08:26:30
【问题描述】:

(Django v 1.10.4) 我正在尝试使用两个单独的应用程序,它们的 url 前缀是站点的根目录(我正在从另一个站点迁移到 django 并且需要维护现有的 url 结构)。有问题的两个应用程序/模型是“artistbio/Bio”和“pages/BasicPage”。目前我在主 url 配置中有 url 模式(最初它们在各自的 url.py 文件中,但我遇到的问题是相同的):

from django.conf.urls import include, url
from django.contrib import admin
from django.conf import settings
from artistbio.views import BioDetail
from pages.views import PageDetail


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^(?P<slug>[\w\-]+)/', PageDetail.as_view()),
    url(r'^(?P<slug>[-\w]+)/', BioDetail.as_view(), name='bio-detail'),

我读过的所有内容(以及迄今为止我的所有经验)都表明,Django 将尝试将请求与每个 URL 模式匹配,然后给出“不匹配任何 url 模式”错误或“404 未找到”如果请求的对象确实不存在,则会出错。但是现在当两种模式一起出现时,当我通过 BioDetail 请求 Bio 对象时,它会尝试匹配 PageDetail 的 URL 模式并给我一个 404 错误(这是有道理的),但这似乎也意味着 Django 永远不会移动转到下一个肯定会匹配的 URL 模式。如果我切换它们,并将 BioDetail 模式放在 PageDetail 模式之上,正如预期的那样,我可以访问 Bio 对象,但不能访问 Page 对象。

我已经阅读了我能找到的所有适用的 StackOverflow 条目,阅读了所有官方文档并引用了 Django Unleashed,但似乎仍然缺少解决方案!

【问题讨论】:

    标签: python django django-views django-urls


    【解决方案1】:

    来自Django documentation

    当用户从您的 Django 网站请求页面时,系统会遵循以下算法来确定要执行的 Python 代码:

    1. Django 确定要使用的根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但如果传入 HttpRequest 对象有一个 urlconf 属性(由中间件设置),它的 值将用于代替 ROOT_URLCONF 设置。
    2. Django 加载该 Python 模块并查找变量 urlpatterns。这应该是 django.conf.urls.url() 的 Python 列表 实例。
    3. Django 按顺序运行每个 URL 模式,并在第一个匹配请求的 URL 时停止。
    4. 一旦其中一个正则表达式匹配,Django 就会导入并调用给定的视图,这是一个简单的 Python 函数(或基于类的视图)。 [...]

    关注第 3 点:只要正则表达式验证当前 URL,Django 就会停止处理 urlpatterns 变量。它调用视图,如果该视图返回 404,则将错误返回给客户端。

    如果视图返回 404,Django 将不会继续使用以下模式匹配 url。

    所以基本上,要解决您的问题,您必须编写一个与 URL 匹配的视图,分析 slug 并尝试获取相应的 PageBio(按此顺序)。但我建议您计划迁移到 Pages 和 Bio 有自己的视图来显示内容的系统。

    【讨论】:

    • 感谢您的回答安特瓦内。所以我认为这意味着我正在尝试做的事情是不可能的?如果没有,我会将两个模型合二为一,然后继续。
    • 是的,除非你自己开发一个特殊的视图来处理这个特定的情况(见答案末尾)
    • 无论如何,你绝对应该为艺术家和页面设置不同的 url 方案 - 否则有一天你会有一个页面和艺术家有类似的 slug,一个会影响另一个(或者你需要一个“消歧义”页面”一个là维基百科,这是一种kludge)。 FWIW 让所有艺术家的网址都以“/artist/”为前缀,恕我直言,即使是 SEO POV。
    • bruno - 我会调查他们是否愿意更改网址,这肯定会让事情变得更容易。
    猜你喜欢
    • 2021-04-25
    • 2016-12-19
    • 2013-01-31
    • 2017-09-09
    • 1970-01-01
    • 2014-01-22
    • 2017-06-23
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多