3:Django视图与路由
首先新建一个项目
django-admin startproject mytest

项目生成后的目录结构
mytest
|----manage.py
|----mytest
       |----__init__.py
       |----settings.py
       |----urls.py
       |----wsgi.py


新建app应用:
到 mytest 目录下生成app
django-admin startapp test1(app名称)

目录结构:
mytest
|----manage.py
|----mytest
       |----__init__.py
       |----settings.py
       |----urls.py
       |----wsgi.py
|----test1
       |----__init__.py
       |----admin.py
       |----apps.py
       |----models.py
       |----tests.py
       |----views.py
       |----migrations
              |----__init__.py

在settings.py 的 INSTALLED_APPS 中添加 app
修改mytest\mytest下的settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'test1',
]


备注,这一步是干什么呢? 新建的 app 如果不加到 INSTALL_APPS 中的话, django 就不能自动找到app中的模板文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件)


定义视图函数:
修改 mytest\test1\views.py
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("hello world 你好")


第一行是声明编码为utf-8, 因为我们在代码中用到了中文,如果不声明就报错.
第二行生成views.py时就有
第三行引入HttpResponse,它是用来向网页返回内容的,就像Python中的 print 一样,只不过 HttpResponse 是把内容显示到网页上。
我们定义了一个index()函数,第一个参数必须是 request,与网页发来的请求有关,request 变量里面包含get或post的内容,用户浏览器,系统等信息在里面。
函数返回了一个 HttpResponse 对象,可以经过一些处理,最终显示几个字到网页上。

定义视图函数相关的URL
修改mytest\test1\url.py
from django.conf.urls import url
from django.contrib import admin
from test1 import views as test1_views

urlpatterns = [
    url(r'^$',test1_views.index),
    url(r'^admin/', admin.site.urls),
]


先引入app的视图,再定义视图的URL

视图和URL进阶

修改mytest\test1\views.py
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("hello world 你好")

def add(request):
    a = request.GET['a']
    b = request.GET['b']
    c = int(a)+int(b)
    return HttpResponse(str(c))


添加一个add视图函数,get两个参数,回传页面参数之和

修改mytest\test1\url.py
from django.conf.urls import url
from django.contrib import admin
from test1 import views as test1_views

urlpatterns = [
    url(r'^$',test1_views.index),
    url(r'^admin/', admin.site.urls),
    url(r'^add/$',test1_views.add,name='add'),
]


启动服务打开浏览器127.0.0.1:8000/add/会发现报错,找不到参数a

这是因为没有传入参数,访问127.0.0.1:8000/add/?a=123&b=456

页面就显示出参数相加的和了


采用/add/4/5这样的URL形式
修改mytest\test1\views.py
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("hello world 你好")

def add(request):
    a = request.GET['a']
    b = request.GET['b']
    c = int(a)+int(b)
    return HttpResponse(str(c))

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


修改mytest\test1\url.py
from django.conf.urls import url
from django.contrib import admin
from test1 import views as test1_views

urlpatterns = [
    url(r'^$',test1_views.index),
    url(r'^admin/', admin.site.urls),
    url(r'^add/$',test1_views.add,name='add'),
    url(r'^add/(\d+)/(\d+)/$',test1_views.add2,name='add2') ,
]

起服务,输入URL,127.0.0.1:8000/add/1/3

页面显示了参数相加

URL中的name
url(r'^add/$', calc_views.add, name='add'),
如果在url.py中修改一个url的正则表达式,如果静态页面文件中是写死的<a href="/add2/4/5/">计算 4+5</a>,那网页跳转会出问题
灵活的方式是不要写死url,如下
不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
例如:
<a href="{% url 'add2' 4 5 %}">link</a>

这时候改变url的正则表达式,但是不变后面的name值
url(r'^new_add/(\d+)/(\d+)/$', 'calc.views.add2', name='add2'),
页面的add2会被渲染成new_add

如果想让原来的url都能自动跳转到新的url,也就是重定向,需要修改一下views.py和url.py
修改mytest\test1\views.py
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from django.core.urlresolvers import reverse

def index(request):
    return HttpResponse("hello world 你好")

def add(request):
    a = request.GET['a']
    b = request.GET['b']
    c = int(a)+int(b)
    return HttpResponse(str(c))

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

def old_add2(request,a,b):
    return HttpResponseRedirect(
        reverse('add2',args=(a,b))
        )

HttpResponseRedirect是重定向
reverse('add2',args=(a,b) ) 是获取一个/add2/a/b/形式的url

修改mytest\test1\url.py
from django.conf.urls import url
from django.contrib import admin
from test1 import views as test1_views

urlpatterns = [
    url(r'^$',test1_views.index),
    url(r'^admin/', admin.site.urls),
    url(r'^add/$',test1_views.add,name='add'),
    url(r'^add2/(\d+)/(\d+)/$', test1_views.old_add2),
    url(r'^new_add2/(\d+)/(\d+)/$',test1_views.add2,name='add2')
]

将原来的add2/a/b/形式url指向重定向视图
将新的new_add2/a/b/形式指向原来的add2视图函数
这样在浏览器中输入127.0.0.1:8000/add2/1/3/会自动跳转到127.0.0.1:8000/new_add2/1/3/




Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐