url用法
url中的name用法:
0.定义主rul.py
urlpatterns = [ url(r'^sinfors/', include('sinfors.urls', namespace="sinfors")), url(r'^aptest/', include('aptest.urls', namespace="aptest")), #引用app aptest url(r'^admin/', include(admin.site.urls)), ]
1.定义view.py
# -*- coding: UTF-8 -*- from django.shortcuts import render from django.http import HttpResponse,HttpResponseRedirect from django.core.urlresolvers import reverse # Create your views here. def add2(request,a,b): c=int(a)+int(b) return HttpResponse(str(c)) def add(request): return render(request,'aptest/test01.html') def testvw(request): return HttpResponse(u"aa!")
2.定义app(aptest)下的url.py
from django.conf.urls import url from aptest import views as aptest #aptest是app的名称,主url中已引用该app名称 urlpatterns = [ url(r'^$', aptest.index, name='index'), url(r'^add2/(\d+)/(\d+)/$', aptest.add2, name='add2'), url(r'^add/$', aptest.add, name='add'), url(r'^test011/$', aptest.testvw, name='testname'), #name和url是不同的 ]
访问 http://192.168.50.74/aptest/test011/ ,调用aptest的view中的testvw视图
3.在模板中引用该url
<!DOCTYPE html> <html> <body> <caption>tt <a class="text-info" href="{% url 'aptest:testname' %}">test01</a></caption> <!-- 通过url中定义的name(testname)进行调用,这样该url可以随意改动(比如test011可以改为其他),模板中的调用却不需要进行任何改动 --> <caption>add22 <a class="text-info" href="{% url 'aptest:add2' 3 44 %}">add2</a></caption> <!-- 3 44 是add2视图的两个参数 --> </body> </html>
在url中提供参数:
url(r'^qlusers/(?P<luser>\w+)/(?P<ldate>\d{8})/$', views.mgmt,{'GET': views.mgmt_get_view,'POST': views.mgmt_post_view},name='luserslog'),
访问该url:http://10.16.2.4/appname/qlusers/zhangsan/20160728
luser参数接收字母格式
ldate参数接收8个数字
如下view中接收到一个dict格式字符串:kwargs为{'luser':'zhangsan','ldate':'20160728'}
view:
def mgmt(request,*args,**kwargs): mgmt_get_view = kwargs.pop('GET', None) #return None if GET not exists. mgmt_post_view = kwargs.pop('POST', None) model = kwargs.pop('model', None) if request.method == 'GET' and mgmt_get_view is not None: return mgmt_get_view(request, model,args,kwargs) #将model传递到get view elif request.method == 'POST' and mgmt_post_view is not None: return mgmt_post_view(request, model) #return vmmgmt_post_view(request, *args, **kwargs) raise Http404 #handle get request. def mgmt_get_view(request,model,args,kwargs): if model is not None: obj_list = model.objects.all() #从url中的 model 参数接收到具体的model类。模板中要使用 obj_list 变量做for循环 counts = model.objects.count() assert request.method == 'GET' if kwargs is not None: if 'luser' in kwargs and 'ldate' in kwargs:
下面是一个使用无名组的 URLconf 的例子:
from django.conf.urls.defaults import * from mysite import views urlpatterns = patterns('', (r'^articles/(\d{4})/$', views.year_archive), (r'^articles/(\d{4})/(\d{2})/$', views.month_archive), )
下面是相同的 URLconf,使用命名组进行了重写:
from django.conf.urls.defaults import * from mysite import views urlpatterns = patterns('', (r'^articles/(?P<year>\d{4})/$', views.year_archive), (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive), )
这段代码和前面的功能完全一样,只有一个细微的差别: 取的值是以关键字参数的方式而不是以位置参数的方式传递给视图函数的。
例如,如果不带命名组,请求 /articles/2006/03/ 将会等同于这样的函数调用:
month_archive(request, '2006', '03')
而带命名组,同样的请求就会变成这样的函数调用:
month_archive(request, year='2006', month='03')
使用命名组可以让你的URLconfs更加清晰,减少搞混参数次序的潜在BUG,还可以让你在函数定义中对参数重新排序。 接着上面这个例子,如果我们想修改URL把月份放到 年份的 前面 ,而不使用命名组的话,我们就不得不去修改视图 month_archive 的参数次序。 如果我们使用命名组的话,修改URL里提取参数的次序对视图没有影响。