(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,但似乎仍然缺少解决方案!
答案 0 :(得分:2)
当用户从Django支持的站点请求页面时,这是系统遵循的算法,以确定要执行的Python代码:
- Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但是如果传入 HttpRequest对象有一个urlconf属性(由中间件设置),它的 值将用于代替ROOT_URLCONF设置。
- Django加载Python模块并查找变量urlpatterns。这应该是django.conf.urls.url()的Python列表 实例
- Django按顺序遍历每个URL模式,并在第一个匹配请求的URL的位置停止。
- 一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。 [...]
醇>
关注第3点:一旦regexp验证当前URL,Django就会停止处理urlpatterns
变量。它调用视图,如果该视图返回404,则错误将返回给客户端。
如果视图返回404,Django将不会继续将url与以下模式匹配。
基本上,为了解决您的问题,您必须编写一个与URL匹配的视图,分析slug并尝试获取相应的Page
或Bio
(按此顺序)。但我建议您计划迁移到一个系统,其中Pages和Bio有自己的视图来显示内容。