数据编辑和删除
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特点
能够直接根据请求方式的不同直接匹配到对应的方法执行
'''