Django视图层

知识点一:Django2.0中pathre_path的应用

1.from django.urls import path,re_path

2.path不支持正则,精准匹配

3.re_path用法就像1.1中的url(但是可以指定)

urls路由的配置:

from django.urls import path,re_path

from app01 import views
urlpatterns = [

    url(r'^admin/', admin.site.urls),
    #re-path支持正则(类似于url)
    re_path(r'^test01/', views.test01),

    #path 不支持正则,精准匹配,是什么,就匹配什么,跟它有一点不一样,就找不到
    path(r'test02/', views.test02),

    #可以限定test03/路径后面写的,即转化器名字的类型
    path(r'test03/<int:year>',views.test03),

    re_path(r'^$',views.index), #http://127.0.0.1:8000/ 只输这个的时候默认跳转到主页

    re_path(r'', views.error),  #如果没有匹配到就显示网页走丢提示
]

views视图的设置:

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.

def test01(request):
    return HttpResponse('这是test01界面')

def test02(request):
    return HttpResponse('这是test02界面')

#必须和路由里面定义的参数名字一样
def test03(request,year):
    print(year,type(year))
    return HttpResponse('这是test03界面')

def index(request):
    return HttpResponse('这是index主页')


def error(request):
    return HttpResponse('地址错误,走丢了,亲!')

Django默认支持以下5个转化器:

  • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
  • int,匹配正整数,包含0。
  • slug,匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

自定义类型转换:

定义class类

#导入模块register_converter
from django.urls import path,re_path,include,register_converter
#定义类(名字都是固定写法)
class Test:
    #正则限定url输入的位数格式
    regex = '[0-9]{4}'
    #to_python:获取url输入的内容,
    def to_python(self, value):  #value是<>里面输入的内容:即<int:year>
        # 下面可以对着数据再做一些其他的而处理
        value=value+'aaa'
        # return int(value) #还可以对返回给到视图层的value值再做修改
        return value  #return的值会传给视图函数接收

    #to_url用于反向解析
    def to_url(self, value):
        return '%04d' % value  #因为上面是要匹配4个数字,这里就是如果位数不够会自动补全0

register_converter(Test,'yyy')  #(类型,以及重命名后的名字)

路由设置给类传参数:

urlpatterns = [

    #<yyy上面重命名的名字:year和视图接收的名字一样>
    path(r'index/<yyy:year>', views.index),


]

视图层设置:

def index(request,year):
    print(year,type(year)) 
    return HttpResponse('验证自定义转换类型')

验证效果如下:

知识点二:MVC和MTV

M                       T                         V

models          emplate                views

M                       V                        C(路由+views)
models            模板                    控制器

MVC实质就是MTV,Diango框架就是MVC架构

知识点三:视图层

1.request是个对象:

2.form表单里面不定义method=‘’,默认是get请求

3.get与post的使用环境

 get:请求数据,请求页面

 post:向服务器提交数据

4.request.method 是个数据属性,打印的是请求的类型:例如POST、GET

5.request.GET 字典

6.request.POST 字典

7.http://127.0.0.1:8000      /index/ppp/dddd     /?name=lqz

  ip地址和端口                      路径                 参数(数据)

8.request.path  数据属性  打印的是url路径:/index/ppp/dddd  

 request.get_full_path()  打印的是路径+数据:/index/ppp/dddd/?name=lqz

 

9.Request.body :输出是post提交的内容,是bytes类型

知识点四:JsonResponse 向前端页面发json格式字符串

 一般的操作情况借助json:

 #正常情况将json格式输出到网页上显示
  import json
  dic = {'name': 'yangzhizong', 'age': 18}
  aa=json.dumps(dic)    #json.dumps : dict转成str
  print(aa,type(aa))
  return HttpResponse(aa)

拿到的数据就放到页面显示的响应体里面

方式二:利用Django封装的一个模块 JsonResponse

#方法二:模块块JsonResponse
#先导入模块
from django.http import JsonResponse

def index(request):

    dic = {'name': 'yangzhizong', 'age': 18}
    # li=[1,2,3]
    return JsonResponse(dic)  #只能反字典格式
    # return JsonResponse(li)  #无法反列表

如果要想将列表格式传入到页面上,将一下设置改为false即可:

 知识点五:CBV基于类(class base view)和FBV基于函数(function base view)

 演示CBA基于类的格式:

视图层:

1.先到导入模块 :

from django.views import View

2.url路由里面配置:

urlpatterns = [

    url(r'^admin/', admin.site.urls),
   

    path(r'index/', views.index),#做对比说明

    #下面就是CBV在视图里的写法(固定写法)
    #views.Test.as_view()执行完和上面一样也是个函数(即get对应函数 或者post对应的函数)
    #views.Test定位到视图函数那个类 as_views是类里面的一个方法,即括号才能执行
    path(r'index/', views.Test.as_view()), 

]

3.views视图里面如何相应设置

#演示CBV基于类如何使用
from django.views import View

class Test(View):

    #如果是get请求就执行get方法
    def get(self,request):
        obj=render(request,'index.html')
        print(type(obj)) #<class 'django.http.response.HttpResponse'>
        return obj   #返回一个对象和FBA一样

    #如果是post请求就执行get方法
    def post(self,request):
        print(request.POST)
        return HttpResponse('ok')

 实现效果如下:

dispath 派生和分发讲解:注意执行的流程顺序

class Test(View):

    def dispatch(self, request, *args, **kwargs):
        # 第一步:请求来了先走这一步
        #加点东西,可以在运行getpost调用之前再加点别的东西
        print('111')

        #第三步:传给dispatch
        #dispath分发和派生,相当于是个装饰器
        obj=super().dispatch(request,*args,**kwargs)  #这一步实在执行get或者post方法

        #加点东西
        print('2222')
        return obj    #第四步还要回来将返回结果给到页面显示

    #第二步:从这里拿数据
    #如果是get请求就执行get方法
    def get(self,request):
        obj=render(request,'index.html')
        print(type(obj)) #<class 'django.http.response.HttpResponse'>
        return obj   #返回一个对象和FBA一样
    #如果是post请求就执行get方法
    def post(self,request):
        print(request.POST)

原文地址:https://www.cnblogs.com/yangzhizong/p/9594201.html