Django笔记(Django上传头像)

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)
        
        

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值