django数据编辑和删除,请求生命周期,反向解析,有名无名分组反向解析,路由分发,虚拟环境的搭建,视图层的三把斧

数据编辑和删除

res = models.User.objects.filter()
res = models.User.objects.all()

#编辑数据
'''
1、首先得获取用户想要编辑的数据主键值
	<a href="/edit_user/?user_id={{user_obj.id}}" class="btn btn-primary btn-xs">编辑</a>
2、后缀查询出对应的数据对象展示到前端
	利用input标签的value属性
	
3、提交post请求修改数据
	前期提交post请求一定要去配置文件中注释一行
	
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
'''

#更新数据
def edit_user(request):
    #获取url问号后面的参数
    edit_id = request.GET.get('user_id')
    # 查询当前用于想要编辑的数据对象
    edit_obj = models.User.objects.filter(
        id=edit_id).first()
    if request.method=="POST":
        username = request.POST.get('username')
        password =request.POST.get('password')
        #去数据库中修改对应的内容
        #修改数据方式1
        # models.User.objects.filter(id=edit_id).update(username=username,password=password)
        """
        将filter查询出来的列表中所有的对象全部更新     批量更新操作
        """
        #修改数据方式2
        edit_obj.username = username
        edit_obj.password = password
        edit_obj.save()

        return redirect('/userlist/')

    #将数据对象展示到页面上
    return render(request,'edit_user.html',locals())

#删除数据

def delete_user(request):
    #获取用户想要删除的数据的id
    delete_id = request.GET.get('user_id')
    #直接去数据库中找到对应的数据删除即可
    models.User.objects.filter(id=delete_id).delete()
    """
    批量删除
    """
    #跳转到展示页面

    return redirect('/userlist/')

django请求生命周期理论图

浏览器
	发送请求(http协议)
web服务网关接口
	1、请求来的时候解析封装
	响应走的时候打包处理
	2、django默认的wsgiref模块不能承重高并发,最大只有1000
	上线之后会替换成uwsgi来增加并发量
	3、WSGI跟wsgiref和uesgi是什么关系
	WSGI是协议
	wsgiref和uwsgi是实现该协议的功能模块
	
django后端
	1、django中间件
	类似于django的保安
	2、url.py  路由层
	识别路由匹配对应的视图函数
	3、views.py  视图层
	网站整体的业务逻辑
	4、templates文件夹   模板层
	网站所有的html文件
	5、models.py   模型层
	orm


反向解析

'''
本质:通过一些方法得到一个结果,该结果可以访问到对应的url从而触发视图函数的运行
'''
#最简单的情况 url第一个参数里面没有正则符号
path('func_k/', views.func,name='ooo'),
#前端
<a href="{% url 'ooo' %}">111</a>
#后端
from django.shortcuts import reverse
reverse('ooo')
'''
别名不能有冲突
'''

有名无名分组反向解析

#无名分组反向解析
url(r'^index/(\d+)/',views.index,name='xxx')
#前端
<a href="{% url 'xxx' 123 %}">111</a>
#后端
reverse('xxx',args=(1,))  #逗号不能省略

'''
数字一般情况下放的是数据的主键值,数据的编辑和删除
url(r'^edit/(\d+)/',views.edit,name='xxx')
def edit(request,edit_id):
	reverse('xxx',args=(edit_id),)
	
	
{% for user_obj in user_queryset %}
	<a href="{% url 'xxx' user_obj.id %}">编辑</a>
	{%endfor%}
'''


#有名分组反向解析
url(r'^func/(?P<year>\d+)/',views.func,name='ooo')

#后端
reverse('ooo',args=(111,))
#前端
<a href="{% url 'ooo' 123 %}">222</a>

路由分发

'''
django的每一个应用都可以有自己的templates文件夹,url.py static文件夹
正是基于上述特点,django能够非常好的做到分组开发(每个人只写自己的app)
作为组长,只需要将手下写的app全部拷贝到一个新的django项目下,然后再配置文件里面注册
所有的app在利用路由分发的特点将所有的app整合起来

当一个django项目中的url特别多时,总路由urls.py代码非常冗余不好维护,这个时候也可以利用
路由分发来减轻总路由的压力

利用路由分发之后,总路由不在干路由与视图函数的直接对应关系
而是做一个分发处理
	识别当前url是属于那个应用下的,直接分发给对应的应用去处理
'''
#总路由
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
    path('admin/', admin.site.urls),
        #1、路由分发
    # url(r'^app01/',include(app01_urls)), #只要url前缀是app01开头的,交给app01处理
    # url(r'^app02/',include(app02_urls)),
    
        #2、终极写法
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls')),
]

#子路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
   url(r'^reg/',views.reg)
]


from django.conf.urls import url
from app01 import views
urlpatterns = [
   url(r'^reg/',views.reg)
]


def reg(request):
    return HttpResponse('app02>>reg')

虚拟环境

'''
在正常开发中,我们会给每一个项目配置一个该项目独有的解释器环境
该环境内只有该项目用到的模块,用不到一概不装

linux:缺什么才装什么

虚拟环境
	你每创建一个虚拟环境就类似于重新下载了一个纯净的python解释器
	但是虚拟环境不要创建太多,是需要消耗硬盘空间
	
扩展:
	每一个项目都需要用到很多模块,并且每个模块的版本还可能不一样
	开发当中我们会给每一个项目配备一个requirements.txt文件
	里面书写了该项目的所有的模块及版本
	你只要输入一条命令即可一键安装所有模块即版本
	
'''

视图层

三板斧

'''
HttpResponse
	返回字符串类型
render
	返回html页面,并且在返回给浏览器之前还可以给html文件传值
redirct
	重定向
'''
 #视图函数必须要返回一个HttpResponse对象
    
#render简单内部原理
    from django.template import Template,Context
    res = Template('<h1>{{user}}</h1>')
    con = Context({'user':{'username':'lz','password':123}})
    ret = res.render(con)
    print(ret)
    return HttpResponse(ret)

JsonResponse对象

'''
json格式的数据的作用
	前后端数据交互需要使用到JSON作为过渡,实现跨语言传输数据
	
前端序列化
	JSON.stringify()      json.dumps()
	JSON.parse()           json.loads()
'''
# import json
from django.http import JsonResponse
def ab_json(request):
    user_dict = {'username':'lz华盛顿','password':123,'gender':'male'}

    l = [111,222,333]
    #先转成JSON格式字符串
    # json_str = json.dumps(user_dict,ensure_ascii=False)
    #将该字符串返回
    # return HttpResponse(json_str)
    # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
    return JsonResponse(l,safe=False)  #默认只能序列化字典,序列化其他要加参数 safe
    #In order to allow non-dict objects to be serialized set the safe parameter to False.

form表单

'''
form表单上传文件类型的数据
	1、method必须指定为post    记得要去settings注释一行(# 'django.middleware.csrf.CsrfViewMiddleware',)
	2、enctype必须换成formdata
'''
def ab_file(request):
    if request.method=='POST':
        # print(request.POST)    #只能获取普通的键值对数据,文件不行
        print(request.FILES)    #获取文件数据
        file_obj = request.FILES.get('file')    #文件对象
        print(file_obj.name)
        with open(file_obj.name,'wb') as f:
            for line in file_obj.chunks():
                f.write(line)
    return render(request,'form.html')

request对象方法

'''
request.method
request.POST
request.GET
request.FILES

request.path
request.path_info
request.get_full_path 			 #能获取完整的url及问号后面的参数
'''

print(request.path)              #/ab_file
print(request.path_info)          # /ab_file
print(request.get_full_path())    # /ab_file?username=lz

FBV与CBV

#视图函数既可以是函数也可以是类
def index(request):
    	return HttpResponse('index')

#CBV
    #CBV路由
    path('login/',views.MyLogin.as_view())
    
    
    from django.views import View
	class MyLogin(View):
    def get(self,request):
        return render(request,'form.html')

    def post(self,request):
        return HttpResponse('post方法')
    
    
'''
FBV与CBV各有千秋
CBV特点
	能够直接根据请求方式的不同直接匹配到对应的方法执行
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值