视图
视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者。简单来说就是一个中转站,在前端和后端代码中有任何的交互的原理,都会在view.py 中通过不同接口体现。
1. 路由配置
配置应用的路由,一种方法是直接添加在这里:
from django.contrib import admin
from django.urls import path
from blog import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index, name='index'), # 首页
path('about/', views.about, name='about'),
]
第二种方法是在在应用里新建urls.py文件配置应用路由:
# 第一步,在主urls中包含应用urls的文件
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^user/', include(('user.urls'), namespace='user')), # 用户模块
]
#第二步,在应用urls中配置路由
from django.conf.urls import url
from apps.user import views
urlpatterns = [
url(r'^register$', views.register, name='register'), # 注册
]
匹配步骤
**2. 获取值
方式一:位置参数
直接使用小括号,通过位置参数传递给视图**。
1)为了提取参数,修改上面的正则表达式如下:
url(r'^delete(\d+)/$',views.show_arg),
2)修改视图show_arg如下:
注意:参数的名字是任意的如a1、b8,尽量做到见名知意。
def show_arg(request,id):
return HttpResponse('show arg %s'%id)
3)刷新浏览器页面,效果如下图:
4)在地址栏输入如下地址:
http://127.0.0.1:8000/2/?a=10
5)浏览器页面效果如下图
方式二:关键字参数
在正则表达式部分为组命名。
1)修改正则表达式如下:
其中?P部分表示为这个参数定义的名称为id,可以是其它名称,起名做到见名知意。
url(r'^delete(?P<id1>\d+)/$',views.show_arg),
2)修改视图show_arg如下
注意:视图show_arg此时必须要有一个参数名为id1,否则报错。
def show_arg(request,id1):
return HttpResponse('show %s'%id1)
3)刷新浏览器页面,效果如下图
视图中获取get和post方法提交的值:
这是这个前后端交互比较重要的部分,正如文章开头所指,在view视图中通过request的方法向模板(网页)请求信息,POST,GET都为请求的方法。(注意:在view.py中绝大部分函数或接口都需要有request这个参数并且在第一位)
#接收请求参数
def show_reqarg(request):
if request.method == 'GET':
a = request.GET.get('a') #获取请求参数a
b = request.GET.get('b') #获取请求参数b
c = request.GET.get('c') #获取请求参数c
return render(request, 'booktest/show_getarg.html', {'a':a, 'b':b, 'c':c})
else:
name = request.POST.get('uname') #获取name
gender = request.POST.get('gender') #获取gender
hobbys = request.POST.getlist('hobby') #获取hobby
return render(request, 'booktest/show_postarg.html', {'name':name, 'gender':gender, 'hobbys':hobbys})
调用模板简写函数render
from django.shortcuts import render
...
def index3(request):
return render(request, 'booktest/index3.html', {'h1': 'hello'})
从view传值到模版渲染(字典形式):
1. 通过render()
def index(request):
str='%s,%s'%(request.path,request.encoding)
return render(request, 'booktest/index.html', {'str':str})
如果返回数据想定义为json值,这里有另一个方法推荐:
return render(request,'booktest/index.html', json.dumps({'str':str}))
2. HttpResponse()
def index2(request):
str='<h1>hello world</h1>'
return HttpResponse(str)
3. JsonResponse()
def json2(request):
return JsonResponse({'h1':'hello','h2':'world'})
4. local()函数
local()为python内置函数,如果在函数中所需要返回值,这个时候就可以用loacl,同时获得request得到的所有变量,减少很多代码量。
def index(request):
a = 1
b = 'ssss'
c = 'fajs;fhaf'
render(request,'index.html',local())
注:本文经转载,加上了一些本人的不才见解,如有问题不妨评论。
本文转载于:
https://blog.youkuaiyun.com/weixin_46036019/article/details/106010730?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161112340216780265492701%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161112340216780265492701&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-5-106010730.first_rank_v2_pc_rank_v29&utm_term=django%20view%E4%B8%AD%E6%B7%BB%E5%8A%A0%E5%85%B6%E4%BB%96%E5%8F%82%E6%95%B0&spm=1018.2226.3001.4187