django学习笔记3:视图与路由
·
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
页面就显示出参数相加的和了
起服务,输入URL,127.0.0.1:8000/add/1/3

页面显示了参数相加
HttpResponseRedirect是重定向
将原来的add2/a/b/形式url指向重定向视图
这是因为没有传入参数,访问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/
更多推荐
所有评论(0)