Python Django在两个不同应用程序中的相同URL模式冲突

Python Django在两个不同应用程序中的相同URL模式冲突,python,django,django-views,django-urls,Python,Django,Django Views,Django Urls,(Django v 1.10.4) 我正在尝试使用两个单独的应用程序,它们的url前缀是站点的根(我正在从另一个站点迁移到django,需要维护现有的url结构)。讨论中的两个应用程序/模型是“artistbio/Bio”和“pages/BasicPage”。目前,我在主url配置中有url模式(最初它们位于各自的url.py文件中,但问题与此相同): 从django.conf.url导入包括,url 从django.contrib导入管理 从django.conf导入设置 从artistbio

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

从django.conf.url导入包括,url
从django.contrib导入管理
从django.conf导入设置
从artistbio.views导入BioDetail
从pages.views导入页面详细信息
URL模式=[
url(r“^admin/”,admin.site.url),
url(r'^(?P[\w\-]+)/',PageDetail.as_view()),
url(r'^(?P[-\w]+)/',biodail.as_view(),name='bio-detail'),
我读到的所有内容(以及我迄今为止的所有经验)都表明,Django将尝试根据每个URL模式匹配请求,然后给出“未匹配任何URL模式”错误或“404未找到”如果请求的对象确实不存在,则会出错。但是现在,当两种模式如上面所列一起时,当我通过BioDetail请求一个Bio对象时,它会尝试与PageDetail的URL模式匹配,并给我一个404错误(这是有意义的)但这似乎也意味着Django永远不会进入下一个URL模式,在那里它肯定是匹配的。如果我切换它们,并将BioDetail模式置于PageDetail模式之上,正如预期的那样,我就可以访问Bio对象,但不能访问Page对象

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

来自:

当用户从Django支持的站点请求页面时,系统将按照以下算法确定要执行的Python代码:

  • Django确定要使用的根URLconf模块。通常,这是根URLconf设置的值,但是如果 HttpRequest对象有一个urlconf属性(由中间件设置),其 值将用于替换根URLCONF设置
  • Django加载该Python模块并查找变量urlpatterns 实例
  • Django按顺序运行每个URL模式,并在与请求的URL匹配的第一个模式处停止
  • 一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图,该视图是一个简单的Python函数(或基于类的视图)。[…]
  • 关注点3:Django停止处理
    urlpatterns
    变量,只要regexp验证当前URL。它调用视图,如果该视图返回404,则将错误返回给客户端

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

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

    来自:

    当用户从Django支持的站点请求页面时,系统将按照以下算法确定要执行的Python代码:

  • Django确定要使用的根URLconf模块。通常,这是根URLconf设置的值,但是如果 HttpRequest对象有一个urlconf属性(由中间件设置),其 值将用于替换根URLCONF设置
  • Django加载该Python模块并查找变量urlpatterns 实例
  • Django按顺序运行每个URL模式,并在与请求的URL匹配的第一个模式处停止
  • 一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图,该视图是一个简单的Python函数(或基于类的视图)。[…]
  • 关注点3:Django停止处理
    urlpatterns
    变量,只要regexp验证当前URL。它调用视图,如果该视图返回404,则将错误返回给客户端

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


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

    谢谢你的回答。所以我认为这意味着我所尝试的是不可能的。如果不可能,我将把两个模型合并成一个,然后继续。是的,除非你自己开发一个特殊的视图,否则这是不可能的为了处理这个特定的情况(见答案的末尾),无论如何,你都应该为艺术家和页面设置不同的url方案——否则总有一天,你会有一个页面和艺术家有类似的鼻涕虫,其中一个会掩盖另一个(或者你需要一个“消歧页面”,即维基百科,这是一种混乱).FWIW的所有艺术家URL前缀为“/artist/”即使是从SEO POV.bruno-我会调查他们是否愿意更改URL,这肯定会让事情变得更容易。谢谢你的回答Antwane。所以我认为这意味着我尝试做的是不可能的?如果不可能,我会将两个模型合并成一个,然后继续。是的,这是不可能的除非你自己开发一个特殊的视图来处理这个特定的情况(见答案的末尾),否则你肯定应该为艺术家和页面设置不同的url方案——否则总有一天,你会有一个页面和艺术家有类似的段塞,一个会影响另一个(或者你需要一个“disam”)
    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'),