一、Django基于正则表达式的URL
# url(r'^detail-(d+)-(d+).html', views.detail), #这和下面的区别是,这两个数可能会变,按照先后顺序获取
# url(r'^detail-(?P<nid>d+)-(?P<uid>d+).html', views.detail), #写死了nid 和uid,接收的参数也要对应着,根据ID一一对应获取(尽量用这种)
def detail(request,nid,uid):
pass
多个参数时,可以使用这种方式接收参数:def detail(request, *args,**kwargs):
urls.py
url(r'^detail/', views.detail), #改前
url(r'^detail-(d+).html', views.detail), #改后,路由url写得好看一点
views.py
def detail(request): #改url.py前的操作
nid = request.GET.get('nid')
detail_info = USER_DICT[nid]
return render(request, 'detail.html',{'detail_info':detail_info})
def detail(request,nid): #改url.py后的操作 url传了+d参数,所以这边也要接收一下
detail_info = USER_DICT[nid]
return render(request, 'detail.html',{'detail_info':detail_info})
detail.html
{% for k,row in user_dict.items %} {# 改url.py前获取的路由? ,看起来以为是动态的 #} <li><a target="_blank" href="/detail/?nid={{ k }}">{{ row.name }}</a></li>#} {% endfor %}
{% for k,row in user_dict.items %} {# 改url.py后获取的路由-#} <li><a target="_blank" href="/detail-{{ k }}.html">{{ row.name }}</a></li> {% endfor %}
二、对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL *****
urls.py
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'),
views.py
from django.urls import reverse
def func(request, *args, **kwargs): 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
{% url "i1" %} # asdfasdfasdf/ {% url "i2" 1 2 %} # yug/1/2/ {% url "i3" pid=1 nid=9 %} # buy/1/9/
{#因为urls.py文件中,路由多添加了name='indexx',所以可以通过这种方式来读取路由跳转,防止路由连接改名字也不受影响#}
<form action="{% url 'indexx' 2 %}" method="post"> {# 如果带有参数,这种跳转方式也不是很好,因为不是动态跳转,一直强制在2页面#}
<form action="{% url 'indexx' nid=1 uid=3 %}" method="post"> {# 如果带有参数,这种跳转方式也不是很好,因为不是动态跳转,一直强制在1/3页面#}
<p><input type="text" name="user" placeholder="用户名:"></p>
<p><input type="text" name="email" placeholder="邮箱:"></p>
<input type="submit" value="提交">#}
<form action="{{ request.path_info }}" method="post"> {#动态生成url,没上面方式这么死板#}
注:
# 当前的URL
request.path_info
三、多级路由分发,include()
project/urls.py
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^cmdb/', include("app01.urls")), url(r'^monitor/', include("app02.urls")), ]
app01/urls.py
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^login/', views.login), ]
app02/urls.py
from django.conf.urls import url,include from django.contrib import admin from app02 import views urlpatterns = [ url(r'^login/', views.login), ]
写在最后:
url(r'^business/$',views.business), #最好加上终止符$,否则如:url(r'^business_add/',views.business)不会识别到