资源暴露
Django 中允许将所有资源通过url 暴露给页面。
这在用户上传头像时非常有用。
配置声明
首先我们需要在settings.py 下书写如下两句代码。
当没有该文件夹时自动创建。
# 用户上传文件存储位置
MEDIA_ROOT = os.path.join(BASE_DIR,"media")
模型路径
我们在ORM 中设置了用户头像的上传路径,将自动与配置中声明的文件夹做拼接。
class UserInfo(AbstractUser):
phone = models.BigIntegerField(verbose_name="手机号",null=True,blank=True)
avatar = models.FileField(
verbose_name="头像",upload_to='avatar/',default='avatar/default.png',max_length=64)
# 自动上传至根目录 media/avatar的文件夹下
# 默认头像
create_time = models.DateField(
verbose_name="注册时间",auto_now=False,auto_now_add=True)
blog = models.OneToOneField(to="Blog",on_delete=models.CASCADE,null=True)
def __str__(self):
return "对象-%s" % self.username
路由设置
最后我们需要将该文件夹下的资源进行暴露,外部才能访问或查看到图片。
# media配置,暴露接口
from django.views.static import serve
from Blog import settings
# 暴露后端指定文件夹资源(可暴露任意文件夹,在settings中指定)
# 写法固定,后面不加斜杠
url(r"^media/(?P<path>.*)",serve,{"document_root": settings.MEDIA_ROOT}),
头像更新
在用户创建时,关于头像我们是这样做的(关于文件对象不需要再手动读,再去写,直接指定就好,内部会全部帮你做好)。
如果上传的是一个图片对象,会自动拿它的name 属性,添加到media/avatar 文件夹下。
if file_obj:
clean_data["avatar"] = file_obj
# 注意!用的auth组件,所以用create_user
models.UserInfo.objects.create_user(**clean_data)
但是如果是设置头像,则不能直接用update ,应该用下面的方式。
if request.method == "POST":
file_obj = request.FILES.get("avatar")
# 这样才可以自动添加 /avatar 的前缀
user_obj = request.user
user_obj.avatar = file_obj
user_obj.save()
# models.Userinfo.objects.filter(user=request.user).update(avatar=file_obj)
# 出现错误,会直接将文件名丢进去,并且不会添加/avatar的前缀。所以不要用这种方式
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|