8)django-示例(url传递参数)

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>

 

posted on 2017-10-28 21:29  shisanjun  阅读(11241)  评论(0编辑  收藏  举报

导航