url傳遞參數有兩種,一個是通過普通分組方式,一個是通過帶命名分組方式
1.傳遞方式
1)普通分組方式,傳遞參數順序是嚴格的。如下例子
url(r'^detail-(\d+)-(\d+).html',views.detail), 共傳遞了兩個參數
def detail(request,nid,uid)第一個(\d+)傳遞給了nid,第二個(\d+)傳遞uid,
但是如果變為detail(request,uid,nid),則第一個(\d+)傳遞給了uid,所以可能會存在傳遞錯誤問題
2) 帶命名分組
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail) 第一個參數一直是傳遞給nid,第二個參數一直傳遞給uid,
所以在視圖中不管nid,uid順序如何,都能傳遞正確。
推薦使用帶命名分組。
3)傳遞的參數很多怎么辦?可以用如下方式
def detail(request, *args,**kwargs):
a. 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) b. 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) 4、 name
2)渲染頁面是動態和靜態頁面
通常我們認為帶?參數頁面為動態的。比如:http://127.0.0.1:8001/detail/?id=3
動態頁面對搜索爬蟲不太友好。百度等靜態頁面更容易收錄。可以改靜態傳遞值http://127.0.0.1:8001/detail-3(這里就需要使用命名分組)
{% for row in USER_DICT.values %} <!-- 這里返回的是values--> <li><a href="/detail/?id={{ row }}">{{ row }}</a></li> {% endfor %} {% for k,v in USER_DICT.items %} <!-- 這里返回的是key,values--> <li><a href="/detail-{{ k }}.html">{{ v.name }}</a></li> {% endfor %} </ul>