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

问题描述 投票:0回答:1

(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,但似乎仍然缺少解决方案!

python django django-views django-urls
1个回答
2
投票

来自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有自己的视图来显示内容。

© www.soinside.com 2019 - 2024. All rights reserved.