Django 视图与网址进阶

此文已经针对 Django 2.0 更新,适用于 Django 1.4 - Django 2.0 所有版本。

一 、在网页上做加减法

1. 采用 /add/?a=4&b=5 这样GET方法进行

1
2
3
django-admin.py startproject zqxt_views
cd  zqxt_views
python manage.py startapp calc

 

自动生成目录大致如下(因不同的 Django 版本有一些差异,如果差异与这篇文章相关,我会主动提出来,没有说的,暂时可以忽略他们之间的差异,后面的教程也是这样做):

 

1
2
3
4
5
6
7
8
9
10
11
12
13
zqxt_views/
├── calc
│   ├── __init__.py
│   ├── admin.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── zqxt_views
     ├── __init__.py
     ├── settings.py
     ├── urls.py
     └── wsgi.py

我们修改一下 calc/views.py文件

1
2
3
4
5
6
7
8
from  django.shortcuts  import  render
from  django.http  import  HttpResponse
 
def  add(request):
     =  request.GET[ 'a' ]
     =  request.GET[ 'b' ]
     =  int (a) + int (b)
     return  HttpResponse( str (c))

注:request.GET 类似于一个字典,更好的办法是用 request.GET.get('a', 0) 当没有传递 a 的时候默认 a 为 0

 

接着修改 zqxt_views/urls.py 文件,添加一个网址来对应我们刚才新建的视图函数。

Django 1.7.x 及以下的同学可能看到的是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
from  django.conf.urls  import  patterns, include, url
 
from  django.contrib  import  admin
admin.autodiscover()
 
urlpatterns  =  patterns('',
     # Examples:
     url(r '^add/$' 'calc.views.add' , name = 'add' ),  # 注意修改了这一行
     # url(r'^blog/', include('blog.urls')),
 
     url(r '^admin/' , include(admin.site.urls)),
)

Django 1.8.x及以上,Django 官方鼓励(或说要求)先引入,再使用。

1
2
3
4
5
6
7
8
9
from  django.conf.urls  import  url
from  django.contrib  import  admin
from  calc  import  views as calc_views
 
 
urlpatterns  =  [
     url(r '^add/$' , calc_views.add, name = 'add' ),   # 注意修改了这一行
     url(r '^admin/' , admin.site.urls),
]

注意:低版本的 Django 也可以先引入,再使用

 

Django 2.0 版本的同学看下面(上面 Django 1.8 的在 2.0 中也可以用,是兼容的)

1
2
3
4
5
6
7
8
9
from  django.contrib  import  admin
from  django.urls  import  path
from  calc  import  views as calc_views
 
 
urlpatterns  =  [
     path( 'add/' , calc_views.add, name = 'add' ),   # new
     path( 'admin/' , admin.site.urls),
]

我们打开开发服务器并访问

1
2
3
python manage.py runserver 8002
默认端口是 8000,上面使用了自定义端口 8002
如果提示 Error: That port is already  in  use. 我们可以在后面加上端口号8001,8888等

打开网址:http://127.0.0.1:8002/add/ 就可以看到

MultiValueDictKeyError at /add/

 

这是因为我们并没有传值进去,我们在后面加上 ?a=4&b=5,即访问 http://127.0.0.1:8002/add/?a=4&b=5

就可以看到网页上显示一个 9,试着改变一下a和b对应的值试试看?

2. 采用 /add/3/4/ 这样的网址的方式

前面介绍的时候就说过 Django 支持优雅的网址

我们接着修改 calc/views.py文件,再新定义一个add2 函数,原有部分不再贴出

1
2
3
def  add2(request, a, b):
     =  int (a)  +  int (b)
     return  HttpResponse( str (c))

接着修改 zqxt_views/urls.py 文件,再添加一个新的 url

Django 1.7.x 及以下:

1
     url(r '^add/(\d+)/(\d+)/$' 'calc.views.add2' , name = 'add2' ),

Django 1.8.x - Django 1.11.x:

1
     url(r '^add/(\d+)/(\d+)/$' , calc_views.add2, name = 'add2' ),

Django 2.0 及以上:

1
     path( 'add/<int:a>/<int:b>/' , calc_views.add2, name = 'add2' ),

我们可以看到网址中多了 (\d+), 正则表达式中 \d 代表一个数字,+ 代表一个或多个前面的字符,写在一起 \d+ 就是一个或多个数字,用括号括起来的意思是保存为一个子组(更多知识请参见 Python 正则表达式),每一个子组将作为一个参数,被 views.py 中的对应视图函数接收。

我们再访问 http://127.0.0.1:8002/add/4/5/ 就可以看到和刚才同样的效果,但是这回网址更优雅了

Django views.py urls.py

猜你喜欢

转载自www.cnblogs.com/laoqr/p/9289571.html
今日推荐