模板语法:(只有一下两种情况)
1:{{ obj}} 变量相关
2:{% for i in list %} 逻辑相关
{% endfor %}
今日内容:
创建路由:新创建的路由必须去settings注册
创建:python.manage.py startapp app02
注册:1.app (支持简写)
2.app02.apps.App01Config(全称)
启动django项目的时候,确保一个端口只有一个django项目在占用,不然容易造成bug
用户能够访问的资源都在url中,只有url中开设的相关资源,你才能访问到(*****)
html文件默认全都放在templates文件夹下
静态文件:前端框架,图片,css,js...默认放在static文件夹下下
static文件夹中默认创建的子文件夹
css文件夹: 当前网站所有的样式文件
js文件夹: 当前网站所有的js文件
img文件夹: 当前网站所有的图片文件
静态文件的配置:
1.STATICFILES_FIRS = [
os.path.join(BASE_DIR,'static')
]
2.STATICFILES_FIRS =(
os.path.join(BASE_DIR,'static'),
)
注:1.都端资源都需要手动暴露给用户,这样你只要输入static文件夹内具体文件的路径,就能访问到
2.STATIC_URL = '/static' 中 static 只是接口前缀,而不是文件夹的名字
3.静态文间动态解析,动态的获取接口前缀
{% 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>
重点:*****
python manage.py makemigrations:默认给所有APP生成迁移脚本(数据迁移记录)
python manage.py migrate:
migrate做了什么:
1.将相关的迁移脚本翻译成SQL语句,在数据库中执行这个SQL语句。
2.如果这个SQL语句执行没有问题,那么就会将这个迁移脚本的名字记录到django_migrations中。
migrate怎么判断哪些迁移脚本需要执行:
1.将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本。
这两中命令调用默认为全局,即对所有最新更改的model或迁移文件进行操作。如果想对部分app进行操作,就要在其后追加app name:
form表单默认是get(url+数据)请求方式,可通过method修改为post
注: 改为post后,需要在settings中注掉一个中间建 csrf,
用post提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会报错.
# 'django.middleware.csrf.CsrfViewMiddleware',
视图函数的处理方式:
方式一:
if request.method == 'GET':
print(request.method) # 能够获取前端请求方式 并且是全大写的字符串
return render(request,'login.html')
elif request.method == 'POST':
return HttpResponse("拿到了 老弟")
方式二:
if request.method == 'POST':
return HttpResponse('来啦 宝贝')
return render(request,'login.html')
注:视图函数中 一般会先处理get请求
获取前端数据:
request.method获取请求方式
GET:
request.GET获取前端get提交的数据(类似一个大字典)
取值:value是列表
方式一: request.GET.get('xxx')
request.GET.getlist('xxx')
方式二: request.GET['XXX']
注: 1.get默认取列表中的最后一个数据
2.getlist会把列表中的数据全取出来
3.强烈不建议使用第二种方式,列表中无数据会报错
POST
request.POST获取前端post提交的数据(就类似于是一个大字典)
取值
request.POST.get('username') # 虽然value是一个列表 但是默认只取列表最后一个元素
# 强烈不建议你使用中括号的形式取值
# 如果想直接把列表全部取出(******)
request.POST.getlist('hobby')
数据库的配置:
因为django默认使用的是sqlite数据库,所以要用其他数据库话要做到以下两步;
1.修改settings
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'fei',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'678666',
'CHARSET':'utf8'
}
}
2.在项目名/应用名 下的__init__文件中让其使用pymysql连接数据库,而不是用mysqldb
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0) #忽略版本冲突
pymysql.install_as_MySQLdb()
注: settings中k,v键值对中k要大写
django orm: 对象关系映射
类---------->表
对象-------->一条记录
对象.属性--->字段对应的值
模型类:
class M(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=255)
password = models.IntegerField()
注:1.在django中的orm中可以不写主键字段,django会帮你创建
2.自己创建了,django不会再帮你创建
3.charfield中必须指定max_length参数
4.models中数据有变动后,需要执行 python manage.py makemigrations 与 python manage.py migrate,两者缺一不可
表字段的增删改查:
增:
1.给新增字段设置默认值
addr = models.CharField(max_length=32,default='China')
2.给新增字段设置为空
age = models.IntegerField(null=True) # 该字段允许为空
删:在models中注释掉 该字段 然后执行更新命令
注:1.执行完后该字段对应的所有数据全部删除
2.不会用到真正意义上的删除(*******)慎用
对数据的增删改查:
查:
先到models模块 from app01 import models
查的方式:
1.models.User.objects.all()
2.models.User.objects.get(xxx=xxx)
3.models.User.objects.filter(xxx=xxx)
4.models.User.objects.filter(xxx=xxx).fist()
注: 1.get方法 拿到数据对象本身,当查询条件不存在 会直接报错 不推荐用
2.filter方法 得到一个列表,列表内是数据对象本身,当查询条件不存在 不会会报错,会返回一个空列表;
filter中支持多个参数,参数间是and关系
3.all方法 查全部数据 得到一个queryset对象 可以直接点query查看年内部对应的sql语句
queryset对象 可以当成一个列表来操作,支持索引(只支持正数索引不支持负的),支持切片(切出来的是新的queryset对象)
4.filter().fist 拿到列表中第一个数据对象 推荐用这个
重点:
用索引取值,当列表中没数据时会报错;
用first取值 虽然内部也是按照索引取值 但是没有数据 也不会报错 返回的是None 内部机制对其进行了优化
增:
方法1.models.User.objects.create(username=username,password=password)
2.user_obj = models.User(username=username,password=password)
user_obj.save()
删:(从前端获取要删除数据的id,根据id删除)
models.User.objects.filter(条件).delete()
改:(查出要修改的数据,渲染到页面让用户修改,然后在传到后端进行修改)
1. models.User.objects.filter(条件).update()
2.edit_obj.username = username
edit_obj.password = password
edit_obj.save()
注: 1.filter 拿到是一个列表 ,他属于批量操作,会一次性全部修改类似for循环
2.会从头到尾将所有字段全部修改一遍,效率极低.