案例:用户注册上传图片。
1:首先创建用户表,其实本质上保存的是文件的路径。
from django.db import models
# Create your models here.
class Yonghu(models.Model):
u_name=models.CharField(max_length=50)
u_age=models.IntegerField(default=17)
#upload 文件上传的相对路径名字,是文件上传的路径的前缀
u_img=models.ImageField(upload_to="icon")
2:上传目录需要配置才能使用
在setting中最后追加
MEDIA_ROOT=os.path.join(BASE_DIR,"static/upload")
例如:
3:html上表单标签:
<input type="file" name="img"> <br/>
表单提交需要用post请求.还需要设置数据的编码类型,如: enctype="multipart/form-data"
<form action="{% url 'day7:doyoursload' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
name:<input type="text" name="name"><br>
age:<input type="text" name="age"><br>
img:<input type="file" name="img"><br>
<input type="submit" value="submit">
</form>
4:服务器获取:
def doupload(request):
name=request.POST.get("name")
age=request.POST.get("age")
img=request.FILES.get("img")
# print(img)
user=Yonghu()
user.u_name=name
user.u_age=age
user.u_img=img
user.save()
return HttpResponse("Success")
注意:
5:展示图片:
在这里假如要获取u_name=xiaoyu上传的照片
def getimg(request):
name=Yonghu.objects.filter(u_name="xiaoyu").first()
# name=Yonghu()
img=name.u_img
# print(img.url)
# print(img.path)
imgpath="/static/upload/"+img.url
print(imgpath)
#打印结果为/static/upload/icon/b.jpg
data={
"all":imgpath
}
return render(request,"showimg.html",context=data)
把打印结果与这个路径比较就明白了。
当初setting设置的
MEDIA_ROOT=os.path.join(BASE_DIR,"static/upload") 后面的路径就是设置文件的上传目录
建表的 u_img=models.ImageField(upload_to="icon") icon就是upload后面的那个目录
合起来就是/static/upload/icon/b.jpg
最后一步,照片展示出来,重新建一个html页面
因为我们已经获得了这个路径,这个路径作为“all”,现在就要把他放在新建html页面的img标签的src属性上
<img src="{{ all }}">
然后访问这个html的地址,url在这里我就不说了,就可以看到那个图片了。