zoukankan      html  css  js  c++  java
  • 路由层 urls.py

    1. 数据操作

    '''
    表字段的增删改查:
    新增的字段:
    	1.直接提供默认值 default
    	2.设置改字段可以为空 null=True
    注意的是 不要轻易的注释models.py中任何跟数据库相关的代码
    主要是跟数据库相关的代码 你在处理的时候一定要小心谨慎
    '''
    
    
    # 数据的增删改查:
    # 1.数据的查:
    	# get():
        res = models.User.objects.get(username=username)
    		# 1.条件存在的情况下 获取的直接是数据对象本身
    		# 2.条件不存在的情况下 会直接报错  所以不推荐你使用get方法查询数据
    	# filter()
        res = models.Userinfo.objects.filter(username=username)
    		# 1.条件存在的情况下 获取到的是一个可以看成列表的数据 列表里面放的才是一个个数据对象本身
    		# 2.条件不存在的情况下  并不会报错 返回的是一个可以看成空列表的数据
    		# 3.filter括号内可以写多个参数逗号隔开  这多个参数在查询的时候 是and关系
    		# 4.filter的结果支持索引取值  但是不支持负数  并且不推荐你使用索引  推荐你使用它封装好的方法 first取第一个数据对象
    
    # 2.数据的增:直接将用户名和密码写入数据库
    	# 1.create()
        user_obj = models.User.objects.create(username=username,password=password)
    		# 1.括号内些关键字参数的形式 创建数据
    		# 2.该方法会有一个返回值 返回值就是当前对象本身
    	# 2.利用对象点方法的方式
    		user_obj = User(username='aa')
    		user_obj.save()  # 将当前对象保存到数据库中
    
    # 3.数据的改:
    	# 方式1:
        # update():去数据库中修改对应的数据
        """update方法会将filter查询出来的queryset对象中所有的数据对象全部更新"""
        	models.User.objects.filter(pk=edit_id).update(username=username,password=password)   # 批量更新
            
        # 1.获取想要编辑的数据:
        	edit_id = request.GET.get('edit_id')
        # 2.获取用户新修改的所有的数据:
        	username = request.POST.get("username")
            password = request.POST.get("password")
        """POST中也是可以获取GET请求携带的参数"""
        
        # 方式2: 获取当前数据对象 然后利用对象点属性的方式 先修改数据  然后调用对象方法保存(不推荐你使用第二种方式,效率低,挨个重新写入一遍)
        edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()  # pk能够自动帮你查询出当前表的主键字段名
    	edit_obj.username = username
    	edit_obj.password = password
    	edit_obj.save()
        
    # 4.数据的删:
    	# delete():获取想要删除的数据id 直接删除
        models.Userinfo.objects.filter(pk=delete_id).delete()
    

    2. 图书管理系统表设计

    # 表与表之间的关系:一对一,一对多,多对多
    
    # 图书
    class Book(models.Model):
        title = models.CharField(max_length=32)
        # DecimalField:总共八位 小数占两位
        price = models.DecimalField(max_digits=8,decimal_places=2)
    	
        # 书和出版社是一对多的关系,外键字段键在多的一方
        publish = models.ForeignKey(to='Publish')  # to指定跟谁是外键关联的,默认关联的是表的主键字段
        """ForeignKey字段:django orm在创建表的时候 会自动给该字段添加_id后缀"""
        # 书和作者是多对多的关系,外键字段建在任何一方都可以,但是推荐建在查询频率比较高的一方
        authors = models.ManyToManyField(to='Author')
        """authors字段仅仅是一个虚拟字段,不会再表中展示出来,仅仅是用来告诉django orm 书籍表和作者表示多对多的关系,自动创建第三张表"""
    
    # 出版社
    class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=255)
    
    # 作者
    class Author(models.Model):
        name = models.CharField(max_length=32)
        phone = models.BigIntegerField()
        # 一对一字段,建在哪张表都可以,但是推荐你建在查询频率比较高的那张表
        author_detail = models.OneToOneField(to='AuthorDetail')
        """OneToOneField字段:django orm在创建表的时候,会自动给该字段添加_id后缀"""
        
    # 作者详情
    class AuthorDetail(models.Model):
        addr = models.CharField(max_length=255)
        age = models.IntegerField()
    

    3. 路由层 urls.py

    urls.py : 路由与视图函数对应关系 >>> 路由层

    # urls.py
    from django.conf.urls import url
    from django.contrib import admin
    
    # 由一条条映射关系组成的urlpatterns这个列表称之为路由表
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    ]
    
    # 函数url关键参数介绍
    # regex:正则表达式,用来匹配url地址的路径部分
    # view:通常为一个视图函数,用来处理业务逻辑
    # kwargs:可选的要传递给视图函数的默认参数(字典形式)
    # name:一个可选的name参数
    
    # 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
    APPEND_SLASH=True   # 默认为True,自动在网址结尾加/
    

    3.1 无名分组与有名分组

    # 无名分组:会将括号内匹配到的内容当做 位置参数 传递给后面的视图函数test(request,args)
    url(r'^test/(d+)/', views.test),
    
    # 有名分组:会将括号内匹配到的内容当做 关键字参数 传递给后面的视图函数test(request,month=123)
    url(r'^test/(?P<month>d+)/', views.test),
    
    # 有名无名不可以结合使用
    # url(r'^test/(d+)/(?P<month>d+)/', views.test),
    
    # 有名无名单独使用的情况下  可以用多个
    url(r'^test/(d+)/(d+)/', views.test),
    url(r'^test/(?P<xxx>d+)/(?P<month>d+)/', views.test),
    url(r'^test_addsajdsjkahdkjasjkdh/(d+)/', views.testadd,name='xxx'),
    url(r'^test_addsajdsjkahdkjasjkdh/(?P<year>d+)/', views.testadd,name='xxx'),
    

    3.2 反向解析

    # 反向解析:根据某一个东西 动态解析出一个结果 该结果可以直接访问对应的url
    	url(r'^test_add/', views.testadd,name='xxx')
    	# 前端解析
    	{% url 'xxx' %}
    	# 后端解析
    	from django.shortcuts import render,HttpResponse,redirect,reverse
        	url = reverse('xxx')
        
    # 无名分组反向解析
    	url(r'^test_addsajdsjkahdkjasjkdh/(d+)/', views.testadd,name='xxx'),
        # 前端解析
            <a href="{% url 'xxx' 1 %}">222</a>
        # 后端解析
            url = reverse('xxx',args=(1,))
        
    # 有名分子反向解析
    url(r'^test_addsajdsjkahdkjasjkdh/(?P<year>d+)/', views.testadd,name='xxx'),
    	# 前端解析
    		<a href="{% url 'xxx' 1 %}">222</a>
            <a href="{% url 'xxx' year=1 %}">222</a>
    	# 后端解析
            url = reverse('xxx',args=(1,))
            url = reverse('xxx',kwargs={'year':123})
    
    # 注意:向解析的别名 一定不要重复
    
    
    ## 用无名分组或者有名分组+反向解析 完成数据的编辑功能 
    '''
    url(r'^edit_user/(d+)/',views.edit_user,name='edit')
    
    user_queryset = models.User.objects.all()
    
    {% for user_obj in user_queryset %}
    	<td>
    		<a href="{% url 'edit' user_obj.pk %}">编辑</a>
            <a>删除</a>
        </td>
    {% endfor %}
    
    def edit(request,edit_id):
    	pass
    '''
    

    3.3 路由分发

    '''
    django里面的app可以有自己的static文件,templates文件夹,urls.py   
    项目名下面的urls.py不再做路由与视图函数对应关系
    而是做一个中转站  只负责将请求分发到不同的app中 
    然后在app的urls.py完成路由与视图函数的对应关系
    '''
    
    url(r'^app01/',include(app01_urls)),
    url(r'^app02/',include(app02_urls)),
    
    # 给路由与视图函数对应关系 起一个别名  后续根据这个别名 就能够动态解析出所对应的url
    
    url(r'^app01/',include(app01_urls)),
    url(r'^app02/',include(app02_urls)),
    

    3.4 名称空间

    # 总路由
    	url(r'^app01/',include('app01.urls',namespace='app01'))
        url(r'^app02/',include('app02.urls',namespace='app02'))
        
    # 通常情况下 起别名的时候 前面可以加上你的应用名
    

    4. 伪静态

    将动态网页假装成是静态的
    这样做的目的是为了提高搜索引擎的SEO查询优先级
    搜索在收录网站的时候 会优先收录看上去像是静态文件的资源
    
    但是无论你怎么使用伪静态进行优化 你也干不过RMB玩家
    

    5. 虚拟环境

    通常针对不同的项目 只会安装该项目所用的模块 用不到的一概不装
    不同的项目有专门的解释器环境与之对应
    每创建一个虚拟环境 就类似于重新下载了一个纯净的python解释器
    虚拟环境不要创建太多个 
    

    6. django版本区别

    urls.py中1.x用的是url,而2.x用的是path
    并且2.x中的path第一个不支持正则表达式,写什么就匹配什么
    如果你觉得不好用,2.x里面还有re_path 这个re_path就是你1.x里面的url
    
  • 相关阅读:
    在ubuntu下复制文件出现权限不够的解决方法
    Ubuntu安装ROS Melodic
    gedit文件操作
    Linux下强制删除文件和权限操作
    VMware Tools 继续运行脚本未能在虚拟机中成功运行 解决方式
    Linux解压命令
    Ubuntu 18.04.4 LTS(Bionic Beaver)安装
    Socket层实现系列 — send()类发送函数的实现
    iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity
    iOS7 CookBook精彩瞬间(二)NSSet、通过Subscript访问类成员等
  • 原文地址:https://www.cnblogs.com/yushan1/p/11722027.html
Copyright © 2011-2022 走看看