- 我们将网站所使用的静态文件默认都放在static文件夹下
-
- 静态文件(前端已经写好的能直接调用的文件)
-
- 网站写好的js文件
-
- 网站写好的css文件
-
- 网站用到的图片文件
-
- 第三方框架
-
- 在setting中找到
-
- STATIC-URL='/static/'
-
- 这个是访问静态文件的令牌
-
- 当你要访问静态文件(boostrap框架)时路径开头应该以/static/开头如:/static/bootstrap-3.3.7-dist/js/bootstrap.min.js
-
- 但是以上当令牌变化访问路径也要跟着变化
-
- 以下配置解决接口前缀不断变化,html页面上路径引用不需要反复变化
-
- # 静态文件动态解析
- {% load static %}
- <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
- <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}">script>
- request.method # 可以获取表单提交过来的method是POST还是GET 是以字符串的形式
- request.POST # 获取用户POST请求提交的普通数据不包括文件
- request.POST.get() # 对象列表最后一个数据
- request.POST.getlist() # 列表全部元素
- # 减少代码逻辑层级
- if request.method == 'POST':
- return HttpResponse('来了,宝贝')
- return render(request,'login.html')
- # 默认的数据库
- # DATABASES = {
- # 'default': {
- # 'ENGINE': 'django.db.backends.sqlite3',
- # 'NAME': BASE_DIR / 'db.sqlite3',
- # }
- # }
- # 修改为mysql数据库
- # 第一步:
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME':'day60',
- 'PORT':3306,
- 'USER':'root',
- 'HOST':'127.0.0.1',
- 'PASSWORD':'123',
- 'CHARSET':'utf8',
- }
- }
- # 第二步:在_init_.py中
- import pymysql
- pymysql.install_as_MySQLdb()
- """
- ORM 对象关系映射
- 作用:能够让一个不懂sql代码的小白 也能通过python面向对象的方式简单快捷的操作数据库
- 缺点:封装程度太高,效率太低,不如手动写sql语句
- 类 表
- 对象 表结构(记录)
- 对象属性 记录每个字段对象的值
- """
- # 1 先去models.py中书写一个类
- class User(models.Model):
- # id int primary_key auto_increment
- id = models.AutoField(primary_key=True)
- # username varchar(32)
- username = models.CharField(max_length=32)
- # password int
- password = models.IntegerField()
-
- # 数据库迁移命令
- pythondj mange.py makemigrations # 将迁移记录记在migrations文件夹中
- pythondj manage.py migrate # 将操作真正的同步到数据库中
- # 字段的增加
- 1.可以在终端内直接给出默认值
- 2.该字段可以为空
- info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
- 3.直接给字段设置默认值
- hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
-
- # 字段的修改
- 直接修改代码然后执行数据库迁移的两条命令即可!
-
- # 字段的删
- 直接注释对应的字段然后执行数据库迁移的两条命令即可!
- 执行完毕之后字段对应的数据也都没有了
- # 数据的增删改查
- #查
- user_obj = models.User.objects.filter(username=username).first()
- # 增
- res = models.User.objects.create(username=username,password=password) # 返回值就是当前被创建的数据对象本身
- 或者
- res = models.User(username=username,password=password)
- res.save()
- # 先讲数据库中的数据全部展示到前端 然后给每一个数据两个按钮 一个编辑一个删除
-
- # 查看
- def userlist(request):
- # 查询出用户表里面所有的数据
- # 方式1
- # data = models.User.objects.filter()
- # print(data)
- # 方式2
- user_queryset = models.User.objects.all()
- # return render(request,'userlist.html',{'user_queryset':user_queryset})
- return render(request,'userlist.html',locals())
-
- # 编辑功能
- # 点击编辑按钮朝后端发送编辑数据的请求
- """
- 如何告诉后端用户想要编辑哪条数据?
- 将编辑按钮所在的那一行数据的主键值发送给后端
- 利用url问号后面携带参数的方式
-
- {% for user_obj in user_queryset %}
- {% endfor %}
- """
- # 后端查询出用户想要编辑的数据对象 展示到前端页面供用户查看和编辑
- def edit_user(request):
- # 获取url问号后面的参数
- edit_id = request.GET.get('user_id')
- # 查询当前用户想要编辑的数据对象
- edit_obj = models.User.objects.filter(id=edit_id).first()
-
- if request.method == "POST":
- username = request.POST.get('username')
- password = request.POST.get('password')
- # 去数据库中修改对应的数据内容
- # 修改数据方式1
- # models.User.objects.filter(id=edit_id).update(username=username,password=password)
- """
- 将filter查询出来的列表中所有的对象全部更新 批量更新操作
- 只修改被修改的字段
- """
-
- # 修改数据方式2
- edit_obj.username = username
- edit_obj.password= password
- edit_obj.save()
- """
- 上述方法当字段特别多的时候效率会非常的低
- 从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
- """
-
- # 跳转到数据的展示页面
- return redirect('/userlist/')
-
-
-
- # 将数据对象展示到页面上
- return render(request,'edit_user.html',locals())
-
- # 删除功能
- """
- 跟编辑功能逻辑类似
- def delete_user(request):
- # 获取用户想要删除的数据id值
- delete_id = request.GET.get('user_id')
- # 直接去数据库中找到对应的数据删除即可
- models.User.objects.filter(id=delete_id).delete()
- """
- 批量删除
- """
- # 跳转到展示页面
- return redirect('/userlist/')
-
- """
- # 真正的删除功能应该需要二次确认 我们这里先不做后面会讲
- # 删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态
- username password is_delete
- jason 123 0
- egon 123 1
- """
- 表与表之间的关系
- 一对多
-
- 多对多
-
- 一对一
-
- 没有关系
- 判断表关系的方法:换位思考
- """
- 图书表
-
- 出版社表
-
- 作者表
-
- 作者详情表
-
-
- """
- 图书和出版社是一对多的关系 外键字段建在多的那一方 book
-
- 图书和作者是多对多的关系 需要创建第三张表来专门存储
- 作者与作者详情表是一对一
- """
- from django.db import models
-
- # Create your models here.
-
-
- # 创建表关系 先将基表创建出来 然后再添加外键字段
- class Book(models.Model):
- title = models.CharField(max_length=32)
- price = models.DecimalField(max_digits=8,decimal_places=2)
- # 总共八位 小数点后面占两位
- """
- 图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
- """
- publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联
- """
- 如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
- 如果你自作聪明的加了_id那么orm还是会在后面继续加_id
-
- 后面在定义ForeignKey的时候就不要自己加_id
- """
-
-
- """
- 图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
- """
- authors = models.ManyToManyField(to='Author')
- """
- authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
- 让orm自动帮你创建第三张关系表
- """
-
-
- class Publish(models.Model):
- name = models.CharField(max_length=32)
- addr = models.CharField(max_length=32)
-
-
- class Author(models.Model):
- name = models.CharField(max_length=32)
- age = models.IntegerField()
- """
- 作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
- """
- author_detail = models.OneToOneField(to='AuthorDetail')
- """
- OneToOneField也会自动给字段加_id后缀
- 所以你也不要自作聪明的自己加_id
- """
-
- class AuthorDetail(models.Model):
- phone = models.BigIntegerField() # 或者直接字符类型
- addr = models.CharField(max_length=32)
-
-
- """
- orm中如何定义三种关系
- publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联
-
- authors = models.ManyToManyField(to='Author')
-
- author_detail = models.OneToOneField(to='AuthorDetail')
-
-
- ForeignKey
- OneToOneField
- 会自动在字段后面加_id后缀
- """
-
- # 在django1.X版本中外键默认都是级联更新删除的
- # 多对多的表关系可以有好几种创建方式 这里暂且先介绍一种
- # 针对外键字段里面的其他参数 暂时不要考虑 如果感兴趣自己可以百度试试看
- # 路由匹配
- url(r'test',views.test),
- url(r'testadd',views.testadd)
- """
- url方法第一个参数是正则表达式
- 只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
- 直接执行对应的视图函数
- 你在输入url的时候会默认加斜杠
- django内部帮你做到重定向
- 一次匹配不行
- url后面加斜杠再来一次
- """
- # 取消自动加斜杠
- APPEND_SLASH = False/True # 默认是自动加斜杠的
-
-
- urlpatterns = [
- url(r'^admin/', admin.site.urls),
- # 首页
- url(r'^$',views.home),
- # 路由匹配
- url(r'^test/$',views.test),
- url(r'^testadd/$',views.testadd),
- # 尾页(了解)
- url(r'',views.error),
- ]
- """
- 分组:就是给某一段正则表达式用小括号扩起来
- """
- url(r'^test/(\d+)/',views.test)
-
- def test(request,xx):
- print(xx)
- return HttpResponse('test')
-
- # 无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
- """
- 可以给正则表达式起一个别名
- """
- url(r'^testadd/(?P
\d+)' ,views.testadd) -
- def testadd(request,year):
- print(year)
- return HttpResponse('testadd')
-
- # 有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
- """
- 嘻嘻 不能混用
- 但是同一个分组可以使用N多次
- """
-
- # 单个的分组可以使用多次
- url(r'^index/(\d+)/(\d+)/(\d+)/',views.index),
- url(r'^index/(?P
\d+)/(?P\d+)/(?P\d+)/' ,views.index),
- # 通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数
-
- # 先给路由与视图函数起一个别名
- url(r'^func_kkk/',views.func,name='ooo')
- # 反向解析
- # 后端反向解析
- from django.shortcuts import render,HttpResponse,redirect,reverse
- reverse('ooo')
- # 前端反向解析