网站所使用的提早已经写好的文件,如:js,css,第三方组件bootstrap、fontawesome、sweetalter等等css
html
针对所用到的静态文件放在static文件夹中,需手动建立前端
一、在settings配置文件中配置python
STATIC_URL = '/static/' # 此处是访问静态资源的前缀,默认状况下接口前缀名与静态文件名保持一致 STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'static1'), ] # 此处的static是文件夹路径,当访问时,若是前缀相同,会从这个路径下依次查找资源,都没有会报错
二、解决动态绑定问题mysql
在配置文件中STATIC_URL改变static名使前端的HTML代码都不会改,在templates文件夹下全部HTML文件中动态引入绑定git
{% 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>
三、form表单中提交方式,默认是get请求,会自动将所请求的数据加在url后sql
http://127.0.0.1:8000/login/?username=admin&password=123
指定为 method='post' 请求就不会在url后有请求的数据,而且全部的input标签都要写name属性,不然后端接收不到所输入的内容数据库
action属性django
一、不写 默认朝当前地址提交数据bootstrap
二、全路径
三、后缀(/login)
当发送post请求时,须要先配置文件中注释掉一行
视图函数应该作到针对不一样的请求来作出不一样的逻辑处理,好比GET请求应该返回一个HTML文件,POST请求应该获取用户提交的数据而后作一系列逻辑处理,因此咱们须要判断请求方式是啥
request对象,用来获取前端的请求方式
request.method # 结果是GET或POST request.POST # 获取post请求提交的数据 结果相似于一个大字典,字典的value是列表套字符串 request.POST.get('username') # 只取列表中的最后一个元素,字符串 request.POST.getlist('username') # 获取整个列表 request.GET # 获取get请求url后携带的数据 结果相似于一个大字典,字典的value是列表套字符串 request.GET.get('username') # 只取列表中的最后一个元素 request.GET.getlist('username') # 获取整个列表
注意:POST请求,便可以经过request.PSOT获取数据,也能够经过request.GET获取携带的数据
一般状况下针对不一样的请求应该作不一样的判断,可是get请求次数要远大于post请求,因此咱们应该对不是get请求的作判断,对get请求不作判断,减小代码层次结构
def login(request): if request.method == 'POST': return HttpResponse('登陆请求收到') return render(request, 'login.html')
链接数据库后能够对数据库中数据查看与修改数据
须要本身手动先建立库,Django支持MySQL5.5及以上版本
一、先去配置文件中配置相关的参数
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库类别 'NAME': 'dome1', # 库名 'HOST': '127.0.0.1', 'POST': 3306, 'USER': 'root', 'PASSWORD': '2694', 'CHARSET': 'utf8' } }
二、在项目名或者应用名下面的__ init__文件中告诉Django使用pymysql链接数据库而不是默认的自带mysqldb
import pymysql pymysql.install_as_MySQLdb()
Django的ORM不会帮你建立库只能帮你建立表
ORM的做用:可以让一个不会数据数据库的也可以经过Python的面向对象方法,经过句点符来简单快捷的操做数据
ORM对象关系映射:
类 <<===>> 表
对象 <<===>> 记录
属性 <<===>> 字段值
一、先去models.py文件中写模型类
class User(models.Model): # id能够不建立,Django ORM会自动建立一个名为id的主键字段,若是本身建立了主键就不会自动建立 # id int primary key auto_increment id = models.AutoField(primary_key=True) username = models.CharField(max_length=64) # 此处的char其实数据库中的是varchar,且必须提供max_length password = models.CharField(max_length=32) email = models.EmailField(default='1321241@qq.com') # 此处的EmailField在数据库中是varchar(254) # price为小数字段 总共8位小数位占2位 price = models.DecimalField(max_digits=8,decimal_places=2)
二、每一次从models类中对数据库进行改变操做都要进行:数据库迁移命令,两条命令永远成对出现,只要动了models.py对数据库进行操做,就必需要执行数据库迁移命令
一、将数据库的改动记录到(migrations文件夹)中
- python manage.py makemigrations
二、将真正的改动同步到数据库中
- python manage.py migrate
两种方式:
一、要么给字段设置默认值
二、运行该字段为空
email = models.EmailField(default='1321241@qq.com') # 设置默认值 hobby = models.CharField(null=True, max_length=(64)) # 设置以前设置的字段默认为空
在models中注释掉对应的字段,执行数据库迁移命令便可
修改models中对应的代码,执行数据库迁移命令便可
两种方式:
一、create()
# 方式一:经过create方法添加数据 user_obj = models.User.objects.create(username=username, password=password)
二、对象的绑定方法
先生成一个user对象
调用对象的绑定方法
# 方式二:先生成一个user对象,再调用对象的绑定方法 user_obj = models.User(username=username, password=password) user_obj.save()
一、查单条和多条指定的数据
filter()
from app01 import models # 至关于SQL语句的select * from user where username='Mr沈' res = models.User.objects.filter(username='Mr沈') # 返回是一个列表套对象,且对象不存在时,不会报错,返回空列表 user_obj = res.first() # 支持索引取值不支持负索引,可是不建议使用,推荐使用first方法
filter()方法内能够放多个关键字参数, 而且多个关键字参数之间是and关系
res = models.User.objects.filter(username='Mr沈', password='123') # 至关于SQL语句的select * from User where username='Mr沈' and password='123'
二、查找全部
一、filter() 括号中不听任何参数就是查全部
res = models.User.objects.filter()
二、all() 查询全部的数据
res = models.User.objects.all()
先根据filter过滤出须要删除的数据所有,再用delete() 方法删除
models.User.objects.filter(id=delete_id).delete()
一、用户如何获取须要修改的数据id,能够经过让前端get请求中携带数据id来获取
<a href="/edit_user/?edit_id={{ user_obj.id }}">编辑</a>
二、根据数据id对数据进行批量修改,两种方式:
一、方式1:update() 推荐使用
models.User.objects.filter(id=edit_id).update(name=username,password=password)
二、方式2:不推荐使用,由于会将数据库全部的数据从新写一遍,效率很慢
# 方式2(了解) # 1 先获取数据对象 edit_obj = models.User.objects.filter(id=edit_id).first() # 2 再修改对象属性 edit_obj.name = username edit_obj.password = password # 3 调用对象的绑定方法保存 edit_obj.save()
表关系有:一对一,一对多,多对多
在书写表关系的时候,要先把基表在models中所有写出来,以后再考虑外键字段,最后要执行数据库迁移命令
图书表与出版社表:是一对多的外键关键关系,外键字段应该创建在多的那一方,ForeignKey(to= '')
# 书籍与出版社 是一对多外键关系 publish = models.ForeignKey(to='Publish') # 默认关联字段就是出版社表的主键字段 # publish = models.ForeignKey(to=Publish) # to后面也能够直接写表的变量名 可是须要保证该变量名在当前位置的上方出现
图书表与做者表:是多对多的外键关系,外键字段创建在哪张表上都行,外键字段推荐创建在查询频率较高的那张表中,为了方便后面基于ORM查询, ManyToManyField(to= '')
# 书籍与做者 是多对多外键关系 authors = models.ManyToManyField(to='Author') # 书籍和做者是多对多关系 """ authors字段是一个虚拟字段 不会真正的在表中建立出来 只是用来告诉django orm 须要建立书籍和做者的第三张关系表 """
做者表与做者详情表:是一对一的外键关系,外键字段创建在哪张表上都行,推荐创建在查询频率较高的那张表中,为了方便后面基于ORM查询, OneToOneField(to= '')
# 一对一外键关系创建 author_detail = models.OneToOneField(to='AuthorDetail')
注意:ForeignKey字段和OneToOneFiled字段在建立表时无论用户有没有加_ id后缀都会自动在该字段名后加_id
建立多对多表时,会自动建立第三张中间表