编程语言
首页 > 编程语言> > django虚拟环境搭配与切换 视图函数view的返回值 JsonResponse对象、FBV与CBV、CBV源码剖析、模板语法传值

django虚拟环境搭配与切换 视图函数view的返回值 JsonResponse对象、FBV与CBV、CBV源码剖析、模板语法传值

作者:互联网

概要

内容详细

1.作业:使用无名有名反向解析完成用户数据的编辑和删除功能
提示:用户数据使用表格标签展示 然后每一行放编辑和删除按钮
点击编辑按钮进入编辑页面 修改数据
点击删除按钮 直接删除数据并刷新页面

1.数据展示
2.给按钮附加功能
3.如何明确用户到底想要编辑哪条数据
	在路由匹配中就应该获取到用户想要编辑的数据主键值
4.点击编辑按钮 应该展示当前数据的编辑页面
	通过无名或者有名分组获取到用户想要编辑的数据主键值
  获取对应的数据对象传递给页面 展示给用户看并提供编辑功能
5.编写删除功能
	路由设计跟编辑功能一致

def home(request):
    data_queryset = models.User.objects.filter()  # [obj1,obj2,obj3]
    return render(request,'home.html',{'data_queryset':data_queryset})


def edit_data(request,edit_id):
    # 获取用户编辑的数据对象
    edit_obj = models.User.objects.filter(id=edit_id).first()
    if not edit_obj:
        return HttpResponse('当前用户编号不存在')
    if request.method == 'POST':
        # 获取新的数据
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 修改原数据 方式1
        # models.User.objects.filter(id=edit_id).update(name=username,pwd=password)
        # 修改原数据 方式2
        edit_obj.name = username
        edit_obj.pwd = password
        edit_obj.save()
        # 重定向到展示页
        return redirect('home_view')  # 括号内也可以直接写反向解析的别名 不适用于无名有名反向解析
    # 将待编辑的数据对象传递给页面展示给用户看
    return render(request,'edit.html',{'edit_obj':edit_obj})


def delete_data(request,delete_id):
    # 获取想要删除的对象数据
    edit_queryset = models.User.objects.filter(id=delete_id)
    if not edit_queryset:
        return HttpResponse("用户编号不存在")
    edit_queryset.delete()
    return redirect('home_view')
    

2.虚拟环境

我们在实际开发工作中 针对不同的项目需要为其配备相对应的解释器环境
eg:
    项目1 需要的环境
    django2.2版本 pymysql3.3版本 requests1.1版本
    项目2 需要的环境
    django1.1版本
    项目3
    flask框架
诸多项目在你的计算机上如何实现无障碍的打开并运行
方式1:把所有需要用到的模块全部下载下来 如果有相同模块不同版本每次都重新下载替换  这种方式比较麻烦 而且涉及到同一个django框架下不同版本如何解决呢 不推荐
方式2:提前先准备好几个解释器环境 针对不同的项目切换即可
 
# 如何创建虚拟环境 相当于需要下载一个全新的解释器
1.如何创建配置虚拟环境步骤:
    点击file-newproject-purepython-修改项目名-选new environment using-勾选上make available to all projects、create、new window 下载过程中可能有点慢 是因为相当于下载一个全新的python解释器一样、下载好后下面会有一个vevn红色文件夹的标识-我们可以在解释器设置中发现只有本身自带的模块(比较少)-双击一下settools搜索一下需要下载的软件,然后下载下来就可以了
2.如何切换环境 选择不同的解释器即可 全文不要再次勾选new environment(意思就是下载好了虚拟环境每次打开都不需要再次重新下载和配置新的虚拟环境)
切换步骤:
    file-new project-选django-然后可以修改项目名-勾选exsit interpreter-然后勾选我们刚刚创建的虚拟环境-create、new window 这样就完成了切换 然后我们一台机器就可以打开两个版本的django项目

3.django版本的区别

# 路由层
django1.X与2.X、3.X版本之间的区别
1.在路由层urls.py中 路由匹配的方法不一样
在django1.X版本中 路由层使用的是url() 第一个参数支持正则表达式
在django2.X与django3.X中 路由层使用的是 path() 第一个参数不支持正则表达式
如果高版本想使用正则 也提供了相应的方法re_path
from django.urls import path,re_path
这个re_path与url的用法一模一样 所以每个版本用法之间基本都差不多 几乎没差别
2.在高版本中 path提供了转换器功能(直接把一个数据转换成另外一种类型)
path('index/<int:id>/', index)
匹配对应位置的数据并且自动转换类型 一般有五种转换器可供选择
#1、五个内置转化器
	- str:匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    - int:匹配正整数,包括0
    - slug:匹配字母、数字、下划线以及横杠组成的字符串
    - uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
    - path:匹配任何非空字符串,包含了路径分隔符(/),不能用"?"
        
#2、示例:
	- path('login/<int:year>', views.login),
    - path('login/<str:name>', views.login),
    - path('login/<path:p>',views.article),
    
#3、高级示例:
	- 实现匹配这种路径:http://127.0.0.1:8000/jason/p/4444.html
    - path('<str:name>/p/<int:id>.html', views.article),
    - re_path(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login)
	- url(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login)
    # url在2.x之后的版本不建议使用,可以使用re_path代替
    
#4、转化器不能在re_path中使用
参考:
https://blog.csdn.net/weixin_49111957/article/details/109754240

4、视图函数返回值

# 视图函数必须返回一个HttpResponse对象
小白必会三把斧: HttpResponse、render、redirect
HttpResponse
class HttpResponse(...):  # 类加括号就是产生一个HttpResponse对象
    pass  
render 
	def render(...):
        return HttpResponse(...)  # 类加括号也产生了一个HttpResponse对象
redirect
	def redirect(...):
        # 多个类继承 最终也产生了一个HttpResponse对象

5、JsonResponse对象

json序列化:
user_dict = {'name':'jason','pwd':123,'hobby':'好好学习'}
return JsonResponse(user_dict,json_dumpa_params={'ensure_ascii':False})
为了防止出现后面中文乱码的情况 我们知道如果在导入json模块后 需要在dump(在里面参数里面写一个ensure_ascii=False的参数)
通过查看在django中查看源码 我们发现:
 class JsonResponse(HttpResponse):
   
def __init__(self,data,json_dumps_params=None, **kwargs): 
    if json_dumps_params is None:
        json_dumps_params= {}
    data= json.dumps(data,**json_dump_params)
通过查看源码解决乱码问题 大白话翻译:我们在看源码的时候 发现只有if json_dumps_params is None: 得到的结果就是一个空字典 所以只要这json_dumps_params里面不为空 那就不会得到空字典 然后解决乱码的问题不是在dump中差一个ensure_ascii=False的结果吗 因为我们知道**加上一个非空字典就会拆成ensure_ascii=False的结果的原理 所以往前推 将这个结果ensure_ascii=False写成一个字典就是json_dumps_params={'ensure_ascii':False}
        
# 整体的一个思路就是:json_dumps_params={'ensure_ascii':False}>>>>>通过前面的两个**>>>转变成ensure_ascii=False放在jump中 >>>>然后满足这个字典不为空 就不会得到一个空字典的要求 满足不乱码条件

所以学习JsonResponse对象我们可以学到的知识: 1.我们需要学会查看源码来解决问题 2.我们可以通过报错信息来解决问题
"""为什么使用JsonResponse还不是原始的json模块"""
 django对json序列化的数据类型的范围做了扩充
    回忆之前我们自己扩展的序列化方法

6、form表单上传文件

解决是如何接收文件数据---form表单上传文件
form表单上传的数据中如果含有文件 那么需要做到以下几件事儿
1.method必须是post
2.enctype必须改为multipart/form-data
	默认是application/x-www-form-urlencoded
3.后端需要使用request.FILES获取
	# django会根据数据类型的不同自动帮你封装到不同的方法中

7、request其他方法

我们已经学过的request的方法:
request.method
request.POST
request.GET
request.FILES
request.body  body里面存放的是接收过来的最原始的二进制数据
request.POST、request.GET、request.FILES这些获取数据的方法其实都是从body中获取数据并解析存放的
request.path   获取路径
request.path_info  获取路径
request.get_full_path()   获取路径并且还可以获取到路径后面携带的参数

8、FBV与CBV

FBV:function base view 基于函数的视图
    url(r'^index/',函数名)
CBV:基于类的视图
    from django import views
    	class MyLoginView(views.View):
        def get(self,request):
            return HttpResponse('from CBV get view')
        def post(self,request):
            return HttpResponse('from CBV post view')
        url(r'^ab_cbv/',views.MyLoginView.as_view())
        
 """
 如果请求方式是GET 则会自动执行类里面的get方法
 如果请求方式是POST 则会自动执行类里面的post方法"""

9、CBV源码剖析

1.切入点:路由匹配
    类名点属性as_view并且还加了括号
    as_view可能是普通的静态方法
    as_view可能是绑定给类的方法
2.对象查找属性的顺序
	先从对象自身开始、再从产生对象的类、之后是各个父类
    MyLoginView.as_view()
    	先从我们自己写的MyLoginView中查找
        没有再去父类View中查找
3.函数名加括号执行优先级最高
url(r'^ab_cbv/',views.MyLoginView.as_view())
项目已启动就会执行as_view方法 查看源码返回了一个闭包函数名view
def as_view(cls):
    def view(cls):
        pass
    return view
url(r'^ab_cbv/',views.view)
# CBV与FBV在路由匹配本质是一样的!!!
4.路由匹配成功之后执行view函数
def view():
    self = cls()
    return self.dispatch(request,*args,**kwargs)
5.执行dispatch方法
	需要注意查找的顺序!!!
    def dispatch():
        handler = getattr(self,request.method.lower())
        return handler(request,*args,**kwargs)
    "查看源码也可以修改 但是尽量不要这么做 很容易产生bug" 

10、模板语法传值

"""
django提供的模板语法只有两个符号
{{}}:主要用于变量相关操作(引用)
{%%}:主要用于逻辑相关操作(循环、判断)"""

1.传值的两种方式
	# 传值方式1:指名道姓的传 适用于数据量较少的情况 节省资源 
    # return render(request,'ab_temp.html',{'name':name})
    # 传值方式2:打包传值 适用于数据量较多的情况(偷懒) 浪费资源
    """locals() 将当前名称空间中所有的名字全部传递给html页面"""
    return render(request,'ab_temp.html',locals())

2.传值的范围
 基本数据类型都可以
 函数名
	模板语法会自动加括号执行并将函数的返回值展示到页面上
    不支持传参(模板语法会自动忽略有参函数)
   文件名
    直接显示文件IO对象
   类名
    自动加括号实例化成对象
   对象名
	直接显示对象的地址 并且具备调用属性和方法的能力
 
# django模板语法针对容器类型的取值 只有一种方式>>>:句点符
既可以点key也可以点索引 django内部自动识别{{data1.info.pro.3.msg }}

标签:return,edit,request,视图,django,虚拟环境,CBV,path,view
来源: https://www.cnblogs.com/wht488232/p/16368763.html