目录
用户信息编辑
用户管理系统(单表)
1.配置文件
2.模型类
3.页面搭建
4.数据添加的逻辑
5.数据编辑的逻辑
6.数据删除的逻辑
1.展示用户信息数据
步骤一:创建django项目并创建app 创建static静态文件夹
在配置文件中操作:
修改templates文件夹路径'DIRS':(os.path.join(BASE_DIR,'templates'))
注释掉'django.middleware.csrf.CsrfViewMiddleware',
添加satatic文件夹路径STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
添加mysql信息:
DATABASES:{
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'day57'
'USER':'root'
'PASSWORDd':'1234',
'CHARSET':'utf8'
'HOST':'127.0.0.1'
'PORT':3306
}
}
mysql创建库
在pycharm中在models.py中创建表(orm语法) 之后添加一些数据信息
步骤二:创建hteml用户信息展示页面
在urls.py文件中做(路由匹配)网址后缀与函数的对应 path('user_info/', views.user_info),
在views.py文件夹中定义函数 返回数据html页面
步骤三:在html文件中进行页面格式、新增、修改及删除按钮设置(用a标签)
表格标签创建及样式设置(用到表格标签table/theard/tbody/tr/th/td)
在td表格数据中进行for循环 然后用对象点字段名的方式获取数据信息 展示到前端页面
步骤四:查询到数据信息
def user_info(request):
list_info = models.Info.objects.filter()
得到的是数据对象<QuerySet [<Info: Info object (2)>, <Info: Info object (3)>]>
将数据返回到html页面 return render(request, 'info.html', locals())
2.新增数据:
步骤一:创建新增数据的html文件
在urls.py文件中做(路由匹配)网址后缀与函数的对应 path('add_info/', views.add_info),
在views.py文件中定义函数 返回添加数据html页面
步骤二:在html文件form表单中修改请求类型(method="POST")
数据展示页面中通过input标签设置用户输入页面及样式设置
在input标签中一定要添加name属性 以及创建提交按钮
步骤三:在views.py数据新增函数中判断用户提交的请求类型(if request.method == 'POST':)
通过request对象方法获取用户输入的数据(name = request.POST.get('username'))
通过orm操作数据增加(models.Info.objects.create(name=name, age=age))
通过重定向切换到数据展示页面
3.修改数据:
步骤一:创建新增数据的html文件
在urls.py文件中做(路由匹配)网址后缀与函数的对应(path('update_info/', views.update_info))
在views.py文件中定义函数 返回添加数据到html页面
步骤二:展示数据html文件中在修改标签按钮中(a标签)通过网址后缀名后添加(href="/del_info/?id={{ userinfo.id }}") 最后面不加/
获取用户想要修改的数据id
步骤三:在html文件form表单中修改请求类型(method="POST")
数据展示页面中通过input标签设置用户输入页面及样式设置
在input标签中一定要添加name属性
以及values属性在修改页面展示数据(value="{{ user_obj.name }") 及创建提交按钮
步骤四:在views.py数据新增函数中获得用户修改的数据id(user_id = request.GET.get('id'))
在views.py数据新增函数中判断用户提交的请求类型(if request.method == 'POST':)
根据id数据获得用户信息数据(name = request.POST.get('username'))
通过orm操作数据修改(odels.Info.objects.filter(id=user_id).update(name=name, age=age))
通过重定向切换到数据展示页面
4.删除数据:
步骤一:在urls.py文件中做(路由匹配)网址后缀与函数的对应(path('del_info/', views.del_info))
在views.py文件中定义函数 返回添加数据到html页面
步骤二:展示数据html文件中在修改标签按钮中(a标签)通过网址后缀名后添加(href="/del_info/?id={{ userinfo.id }}")
步骤三:获得用户需要删除的id(user_id = request.GET.get('id'))
通过orm操作数据删除(models.Info.objects.filter(id=user_id).delete())
通过重定向切换到数据展示页面
django请求生命周期流程图
1.图层:
路由层
视图层
模板层
模型层
django插件
django中间件
django路由匹配
1.路由匹配:path('网址后缀',函数名) 网址后缀一旦匹配上就会自动执行后面的函数 并结束整个路由匹配
2.路由结尾的斜杠情况种类:
2.1 默认情况下不写斜杠 django会做二 第一次匹配不上会让浏览器加斜杆后再次请求
注:django配置文件中可以指定是否自动添加斜杠 一般不用更改
APPEND_SLASH = False
3.转换器:
3.1 path转换器:当网址后缀不固定的时候 可以使用转换器来匹配
3.1.1 类型:
'int':IntConverter(),
'path':PathCoverter(),
'slug':SlugCoverter(),
'str':StringCoverter(),
'uuid':UUIDCoverter(),
3.1.2 路由匹配
path('func/<int:year>/<str:info>/',views.func) 路由匹配(网址后缀不固定)
3.1.3 应用:转换器会将匹配到的内容当做视图函数的关键字传入 转换器与视图函数的参数必须一一对应 并结束整个路由的匹配
path('func/<int:year>/<str:info>/',views.func)
def func(request,year,info):
pass
3.2.re_path正则匹配
3.2.1 正则匹配
re_path('^text/$',views.text)
应用:转换器会将匹配到的内容当做视图函数的关键字传入 转换器与视图函数的参数必须一一对应 并结束整个路由的匹配
3.2.2 正则匹配之无名分组:
re_path('^text/(\d+)/(?P<others>.*?)/',views.text)
应用:正则表达式匹配到的内容会当做视图的位置参数传递给视图函数
3.2.3 正则匹配之有名分组:
re_path('^text/(?P<year>\d+)/(?P<other>.*?)/',views.text)
4.django版本区别:
django1.11中 只支持正则匹配 方法 url()
django2、3、4中 path() re_path()==1.11中的url()
反向解析
反向解析
1.原因:很多时候都提前将页面的路由写死了 一旦路由发送变化会导致所有相关页面的连接失效 因此需要反向解析
2.反向解析:返回一个结果 该结果可以访问到对应的路由
3.路由的对应关系起别名:
path('register/',views.reg,name='reg_view')
4.使用反向解析的语法:
html页面:
{% url 'reg_view' %}
后端:
from django.shortcuts import reverse
reverse('reg_view')
注:反向解析不同转换器方法一样(path()、re_path()、ulr())
有名无名反向解析
1、原因:当路由中有不确定的匹配因素 反向解析的时候需要人为给出一个具体的值
2.语法:
path('reg/<str:info>/', views.reg, name='reg_view')
reverse('reg_view', args=('lili',))
{% url 'reg_view' 'lili' %}
注:有名无名反向解析不同转换器方法一样(path()、re_path()、ulr())
路由分发
1.原因:总路由及静态文件与templates文件夹负责django中所有应用的的数据的话 整体数据比较混乱且数据量大 因此django中的应用可以有自己独立的urls.py templates文件夹 static文件夹
2.优点:能够让基于django开发的多个应用完全独立 便于小组开发
3.总路由:
path('app01/',include('app01.urls')).
path('app02/',include('app02.urls'))
子路由:
path('after/',views.after) # app01
path('after/',views.after) # app02
注:当项目特别大时 可以使用路由分发
名称空间
1.原因:有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
2.解决方式:
方式一:名称空间 namespace
path('app01/', include(('app01.urls', app01),namespance='app01'))
path('app02/', include(('app02.urls', app01),namespance='app02'))
方式二:别名不冲突(在别名前加应用名)
标签:04,框架,views,django,path,id,路由,页面
From: https://www.cnblogs.com/040714zq/p/16647937.html