我对Django很陌生,当我布局我的网站时,我是这样做的:
该项目是某种"门户",
- App 1"home"是存放主页、登录、注册的App和其他"全站"功能
- App 2的"库存"是一个基本的资产库存
- App 3"仪表板"是一组基于库存资产的状态仪表板
现在我正在尝试添加登录功能,我有一个主项目urls.py,看起来像这样:
文件:/portal/urls . py
from django.conf import settings
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', include('home.urls'), name='home'),
url(r'^admin/', include(admin.site.urls), name='admin'),
url(r'^inventory/', include('inventory.urls'), name='inventory'),
url(r'^dashboard/', include('dashboard.urls'), name='dashboard'),
url(r'^capacity/', include('capacity.urls'), name='capacity'),
)
我的计划是使用包含…/home/urls.py来管理任何站点范围的功能,如登录,注册等。
现在主页索引视图显示得很好,但是…/home/urls.py中的任何其他内容都会给我一个404
文件:/home/urls.py
from django.conf.urls import patterns, url
from home import views
urlpatterns = patterns('',
url(r'^test/$', views.index, name='home_test'),
url(r'^ajax_login/$', views.ajax_login, name='ajax_login'),
url(r'^$', views.index, name='home_index'),
)
在这一点上,我想我的问题是双重的:我的做法是正确的吗?如果是这样,我如何获得所需的功能?如果不是,我应该如何改变事物的设置/布局方式,以正确的"最佳实践"方式做到这一点?提前感谢!
编辑
得到它的工作感谢dt0xff和holdenweb,接受holdenweb的答案,因为它是更准确的,包括需要把主页url包含在其余的下面。
这是我的新portal/urls.py文件供参考
文件:/portal/urls . py
from django.conf import settings
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls), name='admin'),
url(r'^inventory/', include('inventory.urls'), name='inventory'),
url(r'^dashboard/', include('dashboard.urls'), name='dashboard'),
url(r'^capacity/', include('capacity.urls'), name='capacity'),
url(r'^', include('home.urls'), name='home'),
)
问题在于你的第一个模式,它只匹配空URL。因此,任何空URL都将导致home/urls.py
URL被分析,但即使在其中也只有空URL会匹配。
不幸的是,如果没有共同的前缀,那么模式"^"
将匹配每个URL(因为它们都从开头开始…)。
因此,您应该为所有页面使用通用前缀,或者将主URL规范放在最后,以便在测试之前给其他URL一个匹配的机会。
Django在url中是这样看的:
- 获取根url列表- portal/urls
- 首先查找与当前url匹配的
- 如果是包含的,去包含的url,切断匹配的部分
你的问题在这里
url(r'^$', include('home.urls'), name='home'),
我的意思是,这里
'^$'
你想让url匹配"start and then end of url"。它可以很好地与根(dunno.com/
),但不是与其他,因为url将包含更多的东西…
所以,只要去掉$
就可以了
url(r'^', include('home.urls'), name='home'),
您永远不需要在project/urls.py中添加regex($)