静态文件配置
-
视图函数都必须有返回值, 并且返回值都是HttpResponse对象
-
默认情况下, 所有的html文件都是放在templates文件夹内
-
用户在浏览器中输入网址能访问到对应的资源, 前提是后端提前开设了该资源的访问接口
-
静态文件: 网站所使用到的提前写好的css, js, 第三方前端模块, 图片等都叫做静态资源
默认情况下, 网站所用到的静态文件全部会放在static文件夹下,
通常情况下会在static文件夹内再建立文件夹对不同静态文件加以区分,
例如: css文件夹, js文件夹, font文件夹等,
django中, 需要自己手动创建静态文件存放的文件夹
-
禁止浏览器使用缓存: f12-->...-->Settings-->Network-->Disable cache
STATIC_URL = '/static/' # 访问静态资源文件接口前缀
# STATIC_URL = '/xxx/'
STATICFILES_DIRS = [ # 静态资源所在文件夹路径
os.path.join(BASE_DIR, 'static'), # 将static文件里的所有资源上线到服务器
os.path.join(BASE_DIR, 'static1')
]
# <script src="/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
-
动态绑定静态文件, 映射关系:
多<==>一<==>一
多: 动态变化的url后缀, 一: 文件夹路径, 一: 模板语法内置的static变量
{% load static %} <script src="{% static 'jQuery.3.4.1.js' %}"></script> <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对象的方法
form表单默认是get请求
-
get请求也能够携带参数
http://127.0.0.1:8000/login/?username=cql&password=123
- 格式: url?xxx=xxx&yyy=yyy
-
get请求携带参数特点:
- 携带数据不安全
- 携带的数据大小有限制
- 通常只会携带一些不是很重要的数据
-
在朝后端提交post请求出现403时, 需要去配置文件中注释掉一行内容,
MIDDLEWARE-->'django.middleware.csrf.CsrfViewMiddleware', 中间件
-
浏览器无论发get请求还是post请求, 都会执行django后端的视图函数
- get请求, 获取login页面
- post请求, 提交数据, 然后后端做校验
-
获取前端请求方式: request.method, 大写的字符串
-
获取用户提交的post请求的数据: request.POST, 相当于字典
''' print(request.POST) # <QueryDict: {'username': ['cql'], 'password': ['123']}> username = request.POST.get('username') password = request.POST.get('password') print(username, type(username)) # cql <class 'str'> print(password, type(password)) # 123 <class 'str'> username_lt = request.POST.getlist('username') print(username_lt, type(username_lt)) # ['cql'] <class 'list'> 用get取值, 默认只取列表最后一个元素, 如果想获取列表, 需使用getlist '''
-
获取用户提交的get请求的数据: request.GET, 更细粒度获取数据: request.GET.get, request.GET.getlist
django连接数据库
文件配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定数据库类型
'NAME': 'django', # 指定库的名字
'USER': 'root', # 键必须是全大写
'PASSWORD': 'Cql123456',
'HOST': '127.0.1.1',
'PORT': 3306,
'CHARSET': 'utf8'
}
}
设置不用默认的mysqldb连接, 而是用pymysql连接
在项目名或者在应用名下的__inint__
中书写代码指定
import pymysql
pymysql.install_as_MySQLdb()
django orm
orm优点: 能够让不会数据库操作的人也能够简单方便的操作数据库
orm缺点: 封装程度太高, 会出现查询效率低的问题
django中如何操作orm
-
去models.py中书写模型类
from django.db import models class User(models.Model): id = models.AutoField(primary_key=True) # 当不指定主键时, django会自动创建一个名为id的主键字段 username = models.CharField(max_length=32) # CharField字段必须指定max_length参数 password = models.CharField(max_length=64)
-
一个django项目对应一个数据库
-
数据库迁移(同步)命令
python manage.py makemigrations
, 将数据库的修改记录到app中的migrations文件夹内,类似于日志python manage.py migrate
, 将修改操作真正同步到数据库中- 自动加前缀区分(app01_user), 第一次自动创建默认功能表
- 只要修改了models里面和数据库相关的代码, 就必须重新执行上面两条命令
字段的增删改查
-
增加新字段
''' email = models.EmailField() python manage.py makemigrations 报错: without a default # 未设置默认值 解决: 1) Provide a one-off default now # 在cmd中直接提供默认值 2) Quit, and let me add a default in models.py # 在models对应的表类中设置默认值或允许为空, email = models.EmailFieldnull=True) '''
-
删除字段: 在models对应的表类中直接注释掉对应的字段代码, 然后执行数据库迁移命令(谨慎使用)
完善登录功能
django orm 查询数据库中数据
def login(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
# 数据库查询数据, 结果为列表套数据对象, 可以用多个and关系的关键字参数查询
data = models.User.objects.filter(username=username)
if not data:
return HttpResponse('当前用户不存在!')
user_obj = data[0]
if user_obj.password == password:
return HttpResponse('登录成功!')
return HttpResponse('密码错误!')
return render(request, 'login.html')
展示 + 新增用户功能
django orm 新增数据库中数据
'''
1. 查询数据库中的所有数据展示到前端页面
2. 前端页面上针对不同的数据都有编辑和删除按钮
3. 点击对应的按钮能完成对应的操作
'''
def show_user_lt(request):
user_lt = models.User.objects.all() # 等价于: models.User.objects.filter()
return render(request, 'show_user_lt.html', {'userLt': user_lt})
def add_user(request):
# 草稿: 给用户返回一个添加页面, 然后用户输入提交, 后端获取数据, 写入数据库, 并给重定向到数据展示页
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# create新增数据方法返回值为当前被创建的对象本身
user_obj = models.User.objects.create(username=username, password=password)
# print(user_obj, user_obj.username, user_obj.password)
return redirect('/show_user_lt/') # 添加成功后跳转到数据展示页
return render(request, 'add_user.html')
class User(models.Model):
username = models.CharField(max_length=32)
# 跟数据库没有关系, 所以不需要执行数据库迁移命令
def __str__(self):
return self.username # 该返回值必须是字符串类型
编辑 + 删除用户功能
模板语法的注释
{# {% endfor %}#}
, 不会展示到前端, html的注释会展示到前端
django orm 修改数据库中数据
def edit_user(request):
"""
草稿:
返回一个编辑页面, 该页面上应该展示想要编辑的用户信息
利用get请求携带参数的方式, 获取用户想要编辑的数据的id值
将用户想要编辑的数据查询出来, 展示到编辑页面上, 供用户修改
"""
edit_id = request.GET.get('edit_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')
# 修改数据方法: 批量操作, 会将filter查询出来的列表中的所有对象全部更新
models.User.objects.filter(id=edit_id).update(username=username, password=password)
return redirect('/show_user_lt/')
return render(request, 'edit_user.html', {'edit_obj': edit_obj})
<!--在show_user_lt页面中通过模板语法为每条数据的编辑按钮设置不同的get请求携带参数-->
<tbody>
{% for user_obj in userLt %}
<tr>
<td>
<a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
django orm 修改数据库中数据
def delete_user(request):
delete_id = request.GET.get('delete_id')
# 删除数据方法: 批量操作, 会将filter查询出来的列表中的所有对象全部删除
models.User.objects.filter(id=delete_id).delete()
return redirect('/show_user_lt/')