数据的编辑和删除、Django基础之路由层(urls.py)
1022 数据的编辑和删除、Django基础之路由层(urls.py)
数据的编辑和删除
都要先获取数据库的数据,以列表形式展示到前端页面上
views.py
def user_list(request):
# 获取用户表中的所有数据
user_queryset = models.Userinfo.objects.all() # 结果类似于列表套数据对象,里面是当前表的所有数据对象
# print(user_queryset.query) # 只有queryset对象才能够点query查询内部所对应的sql语句
# print(user_queryset)
# 将数据传递给前端页面展示给用户看
return render(request, 'user_list.html', locals())
数据的编辑
views.py
def update_user(request):
# 编辑数据是基于已经存在了的数据进行一个修改
# 1、获取用户想要修改的数据的主键值,然后去数据库修改数据
edit_id = request.GET.get('id')
# 2、按照得到的id将数据查出来展示到页面上,让用户自己修改
edit_obj = models.Userinfo.objects.filter(id=edit_id).first()
# 3、将编辑对象传递给前端页面
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 查到数据后直接更新
models.Userinfo.objects.filter(id=edit_id).update(username=username, password=password)
return redirect('/user_list/')
return render(request, 'update_user.html', locals())
数据的删除
def delete_user(request):
# 要根据用户想要删除的数据的id值,去数据库中删除数据
# 1、获取id值
delete_id = request.GET.get('id')
# 2、根据id值去数据库中查到该条数据然后直接删除
models.Userinfo.objects.filter(id=delete_id).delete()
# 3、删完后直接返回数据展示页面
return redirect('/user_list/')
django基础之路由层(urls.py)
无名分组和有名分组
什么是分组、为何要分组呢?比如我们开发了一个博客系统,当我们需要根据文章的id查看指定文章时,浏览器在发送请求时需要向后台传递参数(文章的id号),可以使用http://127.0.0.1:8000/article/?id=3,也可以直接将参数放到路径中http://127.0.0.1:8000/article/3/
针对后一种方式django就需要直接从路劲中取出参数,这就用到了正则表达式的分组功能了,分组分为两种:无名分组和有名分组
无名分组
urls.py文件
from django.conf.urls import url
from django.contrib import admin
from homework import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 下述正则表达式会匹配url地址的路径部分为:article/数字/,匹配成功的分组部分会以位置参数的形式传给视图函数,有几个分组就传几个位置参数
url(r'^article/(\d+)/$', views.article),
]
views.py文件
from django.shortcuts import render, HttpResponse, redirect, reverse
# 需要额外增加一个形参用于接收传递过来的分组数据
def article(request,article_id):
return HttpResponse('id为%s的文章内容'%article_id)
有名分组
urls.py文件
from django.conf.urls import url
from django.contrib import admin
from homework import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 下述正则表达式会匹配url地址的路径部分为:article/数字/,匹配成功的分组部分会以关键字参数(article_id=匹配成功的数字)的形式传给视图函数,有几个分组就传几个关键字参数
url(r'^article/(?p<article_id>\d+)/$', views.article),
]
views.py文件
from django.shortcuts import render, HttpResponse, redirect, reverse
# 需要额外增加一个形参用于接收传递过来的分组数据,形参名必须为article_id
def article(request,article_id):
return HttpResponse('id为%s的文章内容'%article_id)
总结:有名分组和无名分组都是为了获取路径中的参数,并传递给视图函数,区别在于无名分组是以位置参数的形式传递,有名分组是以关键字参数的形式传递。
强调:无名分组和有名分组不要混合使用,但是无名和有名可以使用多次
反向解析
反向解析:根据某一个对象,动态解析出一个结果,该结果可以直接访问对应的url
在软件开发初期,url地址的路径设计可能并不完美,后期需要进行调整,如果项目中很多地方使用了该路径,一旦路径发生变化,就意味着所有使用该路径的地方都需要进行修改,这是一个非常繁琐的操作。解决方案就是在编写一条url(regex,view,kwargs=None,name=None)
时,可以通过参数name为url地址的路径部分起一个别名,项目中就可以通过别名来获取这个路径。以后无论路径如何变化,别名与路劲始终保持一致。
上述方案中通过别名获取路径的过程就称为反向解析。
url(r'^test_add/', views.testadd, name='xxx')
# 给路由与视图函数对应关系起一个别名,后续根据这个别名,就可以动态解析出对应的url
前端解析
<!--使用方法-->
<a href="{% url 'xxx' %}"></a>
后端解析,用到reverse对象
# views.py
from django.shortcuts import render, HttpResponse, redirect, reverse
def home(request):
url = reverse('xxx') # reverse给url起的别名
print(url)
return redirect('http: //xiaohuar.com')
无名分组反向解析
url(r'^test_add/(\d+)/', views.testadd,name='xxx'),
前端解析
<a href="{% url 'xxx' 1 %}">222</a>
后端解析
url=reverse('xxx', args=(1,))
有名分组反向解析
url(r'^test_add/(?P<year>\d+)/', views.testadd,name='xxx'),
前端解析
<a href="{% url 'xxx' year=1 %}">222</a>
后端解析
url = reverse('xxx',kwargs={'year':123})
# 给路由与视图函数对应关系 起一个别名 后续根据这个别名 就能够动态解析出所对应的url
# 第一种:麻瓜式
# url(r'^app01/',include(app01_urls)),
# url(r'^app02/',include(app02_urls))
# 第二种
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
注意:反向解析的别名一定不要重复
路由分发
django里面的app可以有自己的static文件夹、templates文件夹、urls.py
项目名下面的urls.py不再做路由与视图函数对应关系,而是做一个中转站,只负责将请求分发到不同的app中,在app中做路由与视图函数的对应关系。
eg:
from django.conf.urls import url,include
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
名称空间(了解)
总路由
url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))
print(reverse('app01:index'))
print(reverse('app02:index'))
通常情况下 起别名的时候 前面可以加上你的应用名
伪静态
将动态网页伪装成是静态的,这样做得目的是为了提高搜索引擎的SEO查询优先级,搜索在收录网站的时候,会优先收录看上去像是静态文件的资源,无论你怎么使用伪静态,都干不过充钱的
虚拟环境
不同的项目应该有各自独立的解释器环境,最大化节省资源,实际功能中针对不同项目,有一个叫requestsments.txt文件,该文件列出来的是一个个该项目需要用到的模块名和版本号。
通常针对不同的项目,只会安装该项目所用到的模块,用不到的一概不装
不同的项目有专门的解释器环境与之对应
每创建一个虚拟环境,就类似于重新下载了一个纯净的python解释器
虚拟环境不要创建太多个
django版本区别
django1.X和django2.X
区别1:
urls.py中1.x用的是url,而2.x用的是path
并且2.x中的path第一个不支持正则表达式,写什么就匹配什么
如果你觉得不好用,2.x里面还有re_path 这个re_path就是你1.x里面的url