数据的编辑和删除、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查询优先级,搜索在收录网站的时候,会优先收录看上去像是静态文件的资源,无论你怎么使用伪静态,都干不过充钱的

虚拟环境

通常针对不同的项目,只会安装该项目所用到的模块,用不到的一概不装

不同的项目有专门的解释器环境与之对应

每创建一个虚拟环境,就类似于重新下载了一个纯净的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

猜你喜欢

转载自www.cnblogs.com/zhuangyl23/p/11722128.html