路由层 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