两个单独的应用程序冲突中的Django相同的URL模式

时间:2017-01-19 15:09:28

标签: python django django-views django-urls

(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会尝试将请求与每个网址格式匹配,然后再提供“不匹配任何网址格式”错误或“未找到404”如果请求的对象确实不存在则会出错。但是现在当两个模式在一起时如上所列,当我通过BioDetail请求Bio对象时,它尝试匹配PageDetail的URL模式并给我一个404错误(这是有道理的)但它似乎也意味着Django从不移动转到下一个URL模式,它肯定会匹配。如果我切换它们,并将BioDetail模式放在PageDetail模式之上,正如预期的那样我可以访问Bio对象而不是Page对象。

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

1 个答案:

答案 0 :(得分:2)

来自Django documentation

  

当用户从Django支持的站点请求页面时,这是系统遵循的算法,以确定要执行的Python代码:

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

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

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

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