Django 图片 头像 文件 上传 展示

妈呀,Django好叼的呦喂

我是在windows下搞的啊

1. settings.py里面要写的

首先定义 MEDIA_ROOT 作为Django存储上传文件的路径

MEDIA_ROOT = os.path.join(BASE_DIR, 'upload_picture').replace('\\','/')

然后定义一个 MEDIA_URL 作为基础的URL或者目录,MEDIA_URL指向MEDIA_ROOT所指定的media文件

MEDIA_URL = '/upload_picture/'

2. models.py

要用FileField字段.参数upload_to指向的内容是个子文件夹,也就是说上传的文件的目录结构是: 项目目录/upload_picture/headImg/黑人问号脸.jpg

class Userphoto(models.Model):
    userid = models.ForeignKey('auth.User', blank=False, null=True, verbose_name='用户')
    headImg = models.FileField(upload_to='headImg')

3. views.py

存到数据库里面的是图片的路径和名字
删掉老数据,存新数据

def uploadImg(request):
    from .models import Userphoto
    if request.method == 'POST':
        Userphoto.objects.filter(userid=request.user).delete()
        new_img = Userphoto(userid=request.user, headImg=request.FILES.get('img'))
        new_img.save()
    return redirect('pythonnav:blogindex_html')

图片展示的方法

def blogindex_html(request):
    #获取用户头像的图片
    imgs = Userphoto.objects.filter(userid=request.user)
    return render(request,'blogindex.html',{'imgs':imgs })

4. 前端html

图片提交和展示
注意展示的时候{{ img.headImg }}前面加上upload_picture/,这种方法很笨拙,

<div class="user-head">
<form role="form" enctype="multipart/form-data" action="{% url 'pythonnav:uploadImg' %}" method="POST">

{% csrf_token %}

<a href="javascript:;" class="inbox-avatar">

{% for img in imgs %}
<img src="upload_picture/{{ img.headImg }}" alt="">
{% endfor %}

</a>
<div class="user-name">
<h5><a href="#">{{ request.user.username }}</a></h5>
<span><a href="#">{{ request.user.email }}</a></span>

</div>
<div class="user-name">
<input class="btn-info" type="file" name="img">
<button class="btn-info" type="submit">变成头像</button>
</div>

</form>
</div>

展示图片当然还有更优雅的方法,就是在模版中使用 {{ MEDIA_URL }} 具体参考:http://python.usyiyi.cn/documents/django_182/ref/settings.html#std:setting-MEDIA_URL
为啥我不用优雅的方法?哎呀呀我这里如果用优雅的方法就会在前面多个/,我不知道为啥多个/之后链接里就不出现pythonnav这个app名字了很愁

还有更更优雅的方法,直接用{{ img.headImg.url }},但是同样面临上面的问题,前端解析出来的是http://127.0.0.1:8000/upload_picture/headImg/mail-avatar.jpg 而不是 http://127.0.0.1:8000/pythonnav/upload_picture/headImg/mail-avatar.jpg

百思不得姐啊,怎么办怎么办,后来想出来个办法,就是把

MEDIA_URL = '/upload_picture/'

改为

MEDIA_URL = 'upload_picture/'.

这样就没有/导致的问题了,天下太平了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值