zoukankan      html  css  js  c++  java
  • 数据的编辑和删除、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

  • 相关阅读:
    compose 函数实现
    垂直居中的实现方式
    数组去重方法总结
    前端性能优化
    简简单单的几个正则表达式
    ES6
    Vue不兼容IE8原因以及Object.defineProperty详解
    Vuex(二)——关于store
    Vuex(一)——vuejs的状态管理模式
    关于REST的浅显了解
  • 原文地址:https://www.cnblogs.com/zhuangyl23/p/11722128.html
Copyright © 2011-2022 走看看