django 静态文件的配置 orm 中 字段与数据的增删改查 使用MySQL数据库
模板语法:(只有一下两种情况) 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.会从头到尾将所有字段全部修改一遍,效率极低.