Django 路由系統簡述

在前面的例子裏面,咱們已經瞭解,Django裏面能夠經過在Project同名的那個目錄下的urls.py文件裏面配置路由,根據用戶輸入的url,調用不一樣的函數或者類的方法。下面看看具體的一些例子。html


單一的路由對應關係這種方式最直接,前面已經屢次出現, 能夠是fbv或者cbv類型的。python


url(r'^login/', views.login)
url(r'^home/', views.Home.as_view()),


基於正則表達式的路由關係。具體來講,也能夠分紅兩種:a. url(r'^detail-(\d+).html', views.detail) , 這裏出現了一個分組(\d+),所以須要額外的再傳遞一個參數給detail這個函數,若是多個分組的話,須要按照順序傳遞多個參數到detail函數b. url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail), 這裏由於指定了nid和uid,所以傳遞參數的時候也須要指明具體是傳遞給誰的。c. 上面兩種狀況均可以經過萬能參數實現 def detail(request, *args,**kwargs)正則表達式


實戰模板
django

        

url(r'^detail-(\d+)-(\d+).html', views.detail),
def func(request, nid, uid):
pass
def func(request, *args):
args = (2,9)
def func(request, *args, **kwargs):
args = (2,9)
   
#-----------------------------我是分割線------------------------------------ 
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
def func(request, nid, uid):
pass
def funct(request, **kwargs):
kwargs = {'nid': 1, 'uid': 3}
def func(request, *args, **kwargs):
args = (2,9)




給路由的映射設置名稱,這樣更方便調用。reverse方法能夠經過name倒過來找url的路徑app


url.pyide

url(r'^asdfasdfasdf/', views.index, name='i1'),
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'),

view.py函數

def func(request, *args, **kwargs):
    from django.urls import reverse
    url1 = reverse('i1')                              # asdfasdfasdf/
    url2 = reverse('i2', args=(1,2,))                 # yug/1/2/
    url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/

xxx.html
ui

{% url "i1" %}               # asdfasdfasdf/
{% url "i2" 1 2 %}           # yug/1/2/
{% url "i3" pid=1 nid=9 %}   # buy/1/9/



多級app目錄進行分類url

若是存在多個app目錄,每一個app目錄下面均可能存在同名的函數或者url,那麼這種多級的路由方式,能夠經過在主url文件中配置include指向各app目錄下的子url文件,而後在app各自的目錄下,再配置本身的url文件。spa


好比:

wKiom1li8vuRT_Q4AABXnfXtITI193.jpg

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^cmdb/', include("app01.urls")),
    url(r'^monitor/', include("app02.urls")),
]

wKioL1li8vuzPa7XAAByBMs8Two991.jpg

url.py

urlpatterns = [
    url(r'^login/', views.login),
    url(r'^index/', views.index),
    url(r'^user_info/', views.user_info),
    url(r'^userdetail-(?P<nid>\d+)/', views.user_detail),
    url(r'^userdel-(?P<nid>\d+)/', views.user_del),
    url(r'^useredit-(?P<nid>\d+)/', views.user_edit),
    url(r'^orm/', views.orm),
]


views.py

def user_info(request):
    if request.method == "GET":
        user_list = models.UserInfo.objects.all()
        group_list = models.UserGroup.objects.all()
        return render(request, 'user_info.html', {'user_list': user_list, "group_list": group_list})
    elif request.method == 'POST':
        u = request.POST.get('user')
        p = request.POST.get('pwd')
        models.UserInfo.objects.create(username=u,password=p)
        return redirect('/cmdb/user_info/')


wKiom1li8vzCEDtUAABM59QhExI321.jpg


url.py

urlpatterns = [
    url(r'^login/', views.login),
]


view.py

def login(request):
    return HttpResponse('APP02,login')


訪問不一樣app下的效果

wKiom1li9E7gInWNAABf1N5Ix_c164.jpg

wKioL1li9E7A_EMTAAAxbpBuDLY619.jpg

Url裏面還能夠設置默認值,好比說咱們能夠定義一個字典

url(r'^index/', views.index, {'name': 'root'}),


在index這個函數裏面,咱們就能夠直接調用這個默認值

def index(request,name):
print(name)
return HttpResponse('OK')



最後一個是命名空間,這個和前面的多級App分類恰好是反過來的。


好比,有兩個不一樣的Url都指向了同一個App


urls.py

/admin/    include('app01.urls',namespace='m1')
/crm/      include('app01.urls',namespace='m2')

app01.urls

/index/    name = 'n1'

函數裏面生成url的話,須要指定一條明確的路徑

reverser('m1:n1')
相關文章
相關標籤/搜索