Drango框架2
Drango框架2
一.静态文件
1.什么是静态文件
网站所使用到的提前已经写好的文件
css
js
第三方的组件:bootstrap
sweetalert
fontawesome
网站所用到的html文件统一放到templates文件夹中
针对网站使用到的静态文件放到static文件夹中,这个文件夹要自己去手动创建
内部的结构如下:
static
-css
网站所用到的所有的css文件
-js
网站所用到的所有的js文件
-image
网站所用到的所有的图片文件
第三方文件
用户在浏览窗口之所以输入网址能够拿到资源是因为后端已经开设好了相关的资源
2.django的静态文件配置
django在配置文件中给你暴露了配置文件的配置信息,你只需要按照固定的写法书写,即可暴露对应的静态文件资源
基本的配置
STATIC_URL = '/static/' # 这是访问后端静态资源的接口前缀,默认情况下接口前缀名u静态文件名保持一致
<link rel="stylesheet" href="/xxx/bootstrap-3.3.7-dist/css/bootstrap.min.css">
你要想访问后端的静态资源,就必须以接口前缀开头,后面跟上具体的文件路径 才能够访问到相应的资源
当你的接口前缀正确之后,会拿着后面的路径一次去下面列表中额每一个文件夹下去查找对应的资源,顺序是从上往下查找 如果都没有找到才会报错
查找到一个就会立即结束
STATICFILES_DIRS= [
os.path.join(BASE_DIR, 'static') # 这里的static才是你的文件夹路径
os.path.join(BASE_DIR, 'static1')
os.path.join(BASE_DIR, 'static2')
]
如何解决动态绑定的问题
{% 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.nin.js' %}"</script>
form表单
form表单默认是以get请求提交数据的
http://127.0.0.1:8000/login/?username=admin&password=123
action
1.不写 默认朝当前的地址提交数据
2.全路径
3.后缀(/index)
提交post请求时,需要先去配置文件中注释掉一行
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
视图函数应该做到针对不同的请求来做出不同的逻辑判断
例如:
get请求 应该只需要返回一个html文件
post请求 应该来获取用户提交的数据 然后再做进一步的处理
基于上述,你必须要先判断出当前的请求是什么请求
二.request对象
1.获取前端的请求方式
request.method # 结果是一个纯大写的字符串 GET/POST
request.POST # 获取的是post请求所提交的数据 类似于一个大的字典
# <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
request.POST.get() # 只会获取列表最后的一个元素
request.POST.getlist() # 取出整个的列表
request.GET # 获取的是get请求所提交的数据
request.GET.get() # 只会获取列表最后的一个元素
request.GET.getlist() # 取出的是整个的列表
通常情况下针对不同的请求应该要做出不同的处理,而一般情况下get请求的次数要远远大于post请求的次数,所以我们应该针对非get请求作出逻辑判断,将get请求直接写在函数体内而不去做判断
案例
第一种:
def login(request):
if request.method == 'GET':
# get逻辑
return render(request, 'login.html')
elif request.method == 'POST':
# psot逻辑
print(request.method, type(request.methd))
# GET <class 'str'> POST <class 'str'>
# 获取到数据之后
return HttpResponse('马上处理')
为了减少代码的层级:
一般情况下驶入函数处理get请求比较多,所以可以直接在函数体内先写get请求对应的逻辑,将其他的请求利用request.method做出区分
if request.method == 'POST':
return HttpResponse('收到了')
return render(request 'login.html')
2.pycharm连接mysql
略
3.django连接mysql
首先需要你提前创建好对应的库
1.首先去配置文件中配置相关的参数
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库类别
'NAME': 'day49', # 库的名字
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'password':'123',
'CHARSET':'utf8'
}
}
2.在项目名或者应用名下面的__ init __文件中告诉django使用pymysql连接数据库而不是用默认的mysqldb
# 需在__ init __下面加上两行代码告知django框架
import pymysql
pymysql.install_as_MYSQLdb()
三.django orm的简介
1.orm的简介
django orm不会帮我们创建库 需要我们自己手动创建
回顾orm对象关系映射
类 表
对象 记录
属性 字段值
作用:能够让一个不会数据库操作的人能够通过python面向对象的语法 句点符来简单快捷的操作数据
首先需要先去对应的应用下的models.py文件中去书写模型类
models.py
class User(models.Model):
# 相当于 id int primary key auto_increment 这句可以不写,不写默认用id作为主键且自增,写了就用写的
id = models.AutoField(primary_key=True)
# 相当于 name varchar(32) max_length必须要给值
name = models.CharField(max_length=32)
# 相当于 password varchar(32)
password = models.CharField(max_length=32)
2.格外注意:
数据库迁移(同步)命令
只要动了models.py跟数据库相关的代码,就必须要重新执行者两条命令来保证数据库与models.py的一致
# 两行指令
# 将你对数据库的改动记录到migrations文件夹中
python3 manage.py makemigrations
# 将改动真正的同步到数据库中
python3 manage.py migrate
3.字段的增删改查
字段的增
当表中已经存在记录时:
1.要么给该字段设置默认值
2.要么允许该字段可以为空
3.在命令行提示时,直接给默认值
字段的查
肉眼可见
字段的改
修改models代码 之后执行数据库迁移命令
字段的删
只要注释对应字段 执行数据库迁移命令就会将对应的字段以及数据信息全部删除
4.数据库的增删改查
1.查:
filter()
filter返回的结果是一个列表,支持索引取值但是不支持负数取值,并且不推荐使用索引取值 推荐使用.first()
filter方法条件不存在时,不会报错,会返回一个空的列表
filter括号内可以直接放多个关键字参数,并且多个关键字参数之间是and的关系
res = models.User.objects.filter(username='jason',password='123') # 相当于select * from user where username='jason' and password='123';
查看所有的数据
filte() 括号内不写参数是表示拿所有的
all() 用于查询所有的数据
登录功能
def login(request):
# 要给用户返回一个登录的页面
# 获取前端请求的方式
if request.method == 'POST':
username = request.POST.get('username') # 获取用户输入的用户名
password = request.POST.get('password') # 获取用户输入的密码
# 查看数据库
res = models.User.objects.filter(name=username) # 这里的res可以看成是一个列表套数据对象的形式
# print(res) # <QuerySet [<User: User object>]>
# user_obj = res[0] # QuerySet支持索引取值但是不支持负数 并且也不推荐你直接索引取值
if res:
user_obj = res.first() # 推荐
if user_obj.password == password:
return HttpResponse('登录成功!')
else:
return HttpResponse('密码错误!')
# filter方法条件不存在时, 不会报错,会返回一个空的列表
# 还需要注意的是filter括号内可以直接放多个关键字参数 并且多个关键字参数之间的关系是and的关系
return HttpResponse('该用户不存在!')
# 若是get请求返回页面
return render(request, 'login.html')
2.增:
create()
方式一 (推荐)
models.User.objects.create(name=username, password=password)
该方法是有返回值的,返回值是当前被创建的数据对象本身 user_obj
对象的绑定方法
方式二 (不推荐)
先生成一个User对象,再调用对象的绑定方法
user_obj = User(name=username, password=password)
user_obj.save()
# 模拟注册
# 注册功能
def register(request):
# 获取前端请求的方式
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 向数据库中添加数据
models.User.objects.create(name=username, password=password)
return HttpResponse('注册成功!')
# 要给用户一个注册的页面
return render(request, 'register.html')
3.删:
用户点击谁,你的后端就应该去删除谁
后端如何获取用户想要删除的数据id?
1.queryset对象的delete()方法
models.User.objects.filter(id=1).delete() # 批量操作
4.改:
如何获取用户想要修改的数据id?
根据数据id获取数据并且展示到前端页面提供给用户查看
1.queryset对象的update()方法
models.User.objects.filter(id=1).update(**kwargs)
2.对象的属性操作及绑定方法 # 不推荐使用
user_obj = models.User.objects.filter(id=1).first()
user_obj.username = 'jason'
user_obj.save()
该方法会将数据所有的字段重新修改一遍
# 要实现删除与编辑功能需要三个方法
# 删除功能
def delete_user(request):
# 获取要删除的数据的id
delete_id = request.POST.get('delete_id')
# 直接根据id删除数据
models.User.objects.filter(id=delete_id).delete()
# 重定向到展示页
return redirect(request, '/main')
# 编辑功能
def edit_user(request):
# 获取用户要修改的数据的id值
edit_id = request.POST.get('edit_id')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 修改方式
models.User.objects.filter(id=edit_id).update(name=username, password=password)
# 再次跳转到数据展示页面
return redirect(request, '/main')
# 根据id获取数据对象 并且展示到html页面上
edit_obj = models.User.objects.filter(id=edit_id).first()
return render(request, 'editor.html', {'edit_obj': edit_obj})