Django "homepage"应用程序 urls.py 问题



我对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中是这样看的:

  1. 获取根url列表- portal/urls
  2. 首先查找与当前url匹配的
  3. 如果是包含的,去包含的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($)

最新更新