欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

自强学堂 6) Django视图与网址进阶

shiping1 的头像

一 、在网页上做加减法

源代码下载: zqxt_views.zip

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

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

 

自动生成目录如下所示:

 

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))

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

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)),
)

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

1
2
3
python manage.py runserver
如果提示 Error: That port is already in use.在后面加上端口号8001,8888等
python manage.py runserver 8001

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

MultiValueDictKeyError at /add/

 

这是因为我们并没有传值进去,我们在后面加上 ?a=4&b=5,即访问 http://127.0.0.1:8000/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

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

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

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

Django views.py urls.py

二、url 中的 name

我们还有刚才的代码,再来看一下 urls.py 中的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
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'^add/(\d+)/(\d+)/$''calc.views.add2', name='add2'),
    # url(r'^blog/', include('blog.urls')),
 
    url(r'^admin/', include(admin.site.urls)),
)

url(r'^add/$', 'calc.views.add', name='add'), 这里的 name='add' 是用来干什么的呢?

我 们在开发的时候,刚开始想用的是 /add/4/5/ ,后台发现这样不好,比如我们又想改成 /4_add_5/这样的形式,但是我们在网页中,代码中很多地方都写的是 /add/4/5/这样的形式,这样就导致我们在每个地方都要改,修改网址的代价很大。有没有更优雅的方式来解决这个问题呢?当然有:

我们在终端上输入(推荐安装 bpython, 这样Django会用 bpython的 shell)

1
python manage.py shell

 

django-url-name.png

我们在代码中就可以通过 reverse() 来获取对应的网址(这个网址可以用来跳转,也可以用来计算相关页面的地址),只要对应的 url 的name不改,就不用改代码中的网址,在网页模板中也是一样,可以很方便的使用。

1
2
3
4
5
6
不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
 
<a href="{% url 'add2' 4 5 %}">link</a>

这样就可以获取到对应的网址,开始可能觉得直接写网址更好,但是用多了你一定会发现,用“死网址”的方法很糟糕。

 
 

来自  http://www.ziqiangxuetang.com/django/django-views-urls2.html
普通分类: