1.写一个对应的model (TmageField)
实例:
from django.contrib.auth.models import AbstractUser
from django.db import models
# Create your models here.
class MyUser(AbstractUser):
phone = models.CharField(
max_length=13,
verbose_name="手机号",
unique=True
)
icon = models.ImageField(
upload_to="icons",
null= True,
)
2.前端:
注意:from表单上传文件需要添加 enctype='multipart/form-data' method=‘post’ 属性 至少要有一个类型是file的input标签
实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
img{
border-radius: 50%;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
欢迎{{ u_name }}
<img src="{{ icon }}" alt="">
<form action="/dj05app/update" enctype="multipart/form-data" method="post">
<input type="file" name="u_icon">
<input type="submit" value="上传头像">
</form>
</body>
</html>
3.后端
1.在static文件夹下创建一个uploadefiles的文件夹,用来存储接收上传的文件
2.在settings.py中配置
# 设置文件保存路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/uploads')
# 配置查找静态文件路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
3.生成图片的随机名称,需要在项目APP下创建一个my_utils.py ,把随机数的工具函数写在里面
import uuid
import hashlib
def get_random_str():
#获取uuid的随机数
uuid_val = uuid.uuid4()
#获取uuid的随机数字符串
uuid_str = str(uuid_val).encode('utf-8')
#获取md5实例
md5 = hashlib.md5()
#拿取uuid的md5摘要
md5.update(uuid_str)
#返回固定长度的字符串
return md5.hexdigest()
4.拿文件,给对象赋值
@login_required(login_url="/dj05app/my_login")
def update_msg(req):
user = req.user
print(user.icon)
if req.method == "GET":
data = {
'u_name': user.username
#拿头像文件路径
'icon': '/static/uploads/icons/hehe.jpg'
}
return render(req, 'person.html', data)
else:
#拿文件数据
icon = req.FILES['u_icon']
#获取图片的随机名
file_name = 'icons/' + get_rabdom_str() + '.jpg'
#拼接一个自己的文件路径
image_path = os.path.join(settings.MEDIA_ROOT, file_name)
#打开拼接的文件路径
with open(image_path, 'wb')as fp:
#遍历图片的块数据(切块的传图片)
for i in icon.chunks():
#将图片数据写入自己的那个文件
fp.write(i)
#拼接返回数据
data = {
'u_name': user.username
#拿头像文件路径
'icon': '/static/uploads/' + file_name
}
print(user.icon)
return render(req, 'person.html', data)