django -- ImageField 上传图片修改头像

django -- ImageField 上传图片修改头像

头像

Django

ImageField



折腾了差不多一个星期的空闲时间,刚上手不久的 Django 为了上传个头像被弄得没了脾气


定义模型 model.py

headImg   = models.ImageField(upload_to = ‘img‘, default="img/4.jpg")

ImageField 是 Django 的内置数据类型,可以较方便的时间图片处理

upload_to 表示要上传到的目录,会在 media 目录下自动创建,不用加斜杠,不过在实践中发现好像不起作用

default 表示默认图片路径,总不能一开始显示 alt 的内容吧


修改配置 setting.py

PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(‘__file__‘)))

MEDIA_ROOT = os.path.join(PROJECT_ROOT, ‘media/img‘)

MEDIA_URL = "/head/"

PROJECT_ROOT 表示项目的根目录

经过拼接后的 MEDIA_ROOT 就是我们头像的绝对路径了,media 创建在根目录下,那个 img 目录是我自己创建的,可能是姿势不对,反正上面说到的 upload_to 没有自动创建好

还有一个就是 MEDIA_URL,这个是我们访问图片的链接,举例来说如果我们的 MEDIA_ROOT 是 D:/project_name/media/img/ 的话,当我们访问 127.0.0.1:8000/head/img/4.jpg 时,实际上就是访问 D:/project_name/media/img/4.jpg 了,自己实践理解的还是跟网上的博客有些出入

于是我们就可以在 html 上这样表示图片了

<img src="{{ MEDIA_URL }}img/4.jpg">

详细了解这方面的话,可以参考这里,不过以我的理解是有出入的,可能是我错了吧,好像就是 upload_to 这里出现的问题

Django下MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL解惑

值得注意的是,虽然 MEDIA_ROOT 也是存储静态文件的,但是应该和 STATIC 区别开来,不要以为配置了 STATIC 的就可以不同 MEDIA 了,个人理解,应该是 ImageField 中有 media 相关的连接吧


前端

来到前端这边,表单之类的创建就忽略了,可以直接使用 Django 的表单,也可以使用 html 表达,不过在 <form> 标签中,应该添加这个属性

 enctype="multipart/form-data"

如果不加的话,上传的图片就会变成空的了,原因不知


后台 views.py

自然,该后台处理了,也就是 views.py

首先是获取前台的图片信息,第二个 input_img 表示上传标签的属性名

第一个 input_img 是一个对象,有 name , url 等属性

if request.method == ‘POST‘:
		input_img      = request.FILES[‘input_img‘]

然后就是数据库更新了

models.UserProfile.objects.filter(username=username).update(headImg = input_img)

这里的 username 是我登录时保存的 session 值,具体是怎样获得的还是得看个人

本来到这步已经算是大功告成了,因为看到数据库的数据被更新了,而且很多博客资料都说 ImageField 是会处理很多的琐事的,包括把图片放到该放的文件夹

但是,然而并没有,相应的 img 目录下并没有出现新的头像文件,所以显示的时候只能是 Not Found 了,还是,我姿势又是错误的

查看了相关的文档,只能直接用 python 代码实现保存图片了

from PIL import Image
if input_img:
	img=Image.open(input_img)
	img.save(‘E:/package_1.0/media/img/‘+input_img.name)

这里使用了 PIL 库,了解一下基本的就可以使用了

有一个问题,就是 save 的路径,使用相对路径一直出错,只能改为绝对路径了

然后就算是大功告成了,不过,还是前路漫漫


总结

折腾了这么久,写起这些来却是简短的要命,还是得开窍多一点才行

以后如果遇到照着例子敲的时候错误百出的情况,还是好好去弄懂原理吧,这样走起路或许会安慰许多,当然,得时间允许的情况下

时间: 2024-11-05 12:30:48

django -- ImageField 上传图片修改头像的相关文章

Django ImageField 上传图片并保存到数据库

From 代码 class ImageUploadForm(forms.Form): """Image upload form.""" image = forms.ImageField() Model 代码 class ExampleModel(models.Model): model_pic = models.ImageField(upload_to = 'pic_folder/', default = 'pic_folder/None/no-

BBS(仿博客园系统)项目05(后台管理功能实现:文章添加、富文本编辑器使用、xss攻击、BeautifulSoup4模块、富文本编辑器上传图片、修改头像)

摘要 布局框架搭建 随笔添加 后台管理富文本编辑器KindEditor xss攻击 文章简介的截取,BeautifulSoup4模块 富文本编辑器上传图片 头像修改 一.后台管理框架布局搭建 后台管理布局框架分析:导航条.左侧功能区.右侧主要功能显示和实现区 实现: 导航条:使用bootstrap模板:JavaScript>>导航条 左侧:使用bootstrap模板:组件>>列表组 右侧:使用bootstrap模板:JavaScript>>标签页 新建后台管理路由(注意

django中上传图片的写法(转)

view参数 @csrf_exemptdef before_upload_avatar(request):    before = True    return render_to_response('accounts/before_upload_avatar.html',                              {'before': before},                              context_instance=RequestContext(re

python Django注册页面显示头像

python Django注册页面显示头像(views) def register(request): ''' 注册 :param request: :return: ''' if request.method=='GET': obj = Register(request) return render(request, 'register.html', {'obj': obj}) else: obj = Register(request,request.POST,request.FILES) i

关于django批量上传图片

本来想一张一张上传的,但是明显会对客户造成不必要的麻烦,所以如果前台一次性上传五张十张的话,那就简单的多. 但是后台我数据库对于图片存储的字段只有一个,不可能有多少张照片就要多少个字段来存储.也就是说,1:我每次只能在后台存一张到数据库,2:在前台展示的时候我直接可以循环这一个字段来展示我的图片 那么这就涉及到一个列表跟数据循环存储的东西了 用到字典是因为我每张图片还有各自的图片描述,这两个信息时同时提交跟保存的.我把图片保存的url跟他的描述做成列表,然后再循环保存就搞定了. 这里主要用到的就

phpcms 用户修改头像

做的项目用户的头像是存在ucenter里面,phpcms通过phpsso这个单点登录系统? 具体的我也不清楚,phpcms自带的v9_member表里没有存放用户头像的字段,如果需要修改,就要修改ucenter里的头像, 在phpcms里读取用户头像,也需要phpsso,通过它来链接ucenter 从而获取头像. 那么怎么通过在phpcms的控制器里,可以修改用户头像呢. 首先分为两个部分:1.上传头像,并且保存.2.将保存的头像生成缩略图,并且在指定位置生成缩略图. 生成的缩略图以后,上传的头

django ImageField用法

settings里的设置 PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname('__file__'))) MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media') MEDIA_URL = '/media/' models里的设置 img = models.ImageField(upload_to='photo', null=True, blank=True) cateimg = model

Django 后台上传图片前端无法展示

Django admin 实现后台上传文件并在前端展示 1. 首先在model里定义属性: head_img = models.ImageField(u'图片',upload_to='img') 2. 修改settings.py, MEDIA_ROOT = 'statics/' MEDIA_URL = '/' 前端添加 "/static/" 3. 数据库对应实体的表中添加head_img字段,这个只是用来保存文件路径的. 4. 上面配置代表的意思大概是: 上传图片到:web程序目录/s

django里上传图片的操作

  在django里图片上传里,分为两种一种是在django的后台上传图片,以数据库的方式上传,另一种是在html页面以表单的方式上传 首先要先安装下这个包 pip install Pillow==3.4.1 setting里需要设置 上传的路径 MEDIA_ROOT=os.path.join(BASE_DIR,'static/media') 在model里要配置数据库 class PicTest(models.Model): pic=models.ImageField(upload_to='b