路由层 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
posted @ 2019-10-22 19:43  PLPLPL  阅读(118)  评论(0编辑  收藏  举报
// 目录