Django中图片的上传并显示
一、settings配置文件中配置
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'medias').replace('\\', '/')#media即为图片上传的根路径
二、url路由中配置
from django.conf import settings from django.conf.urls.static import static from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index,name='index'), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #如果单纯的是上传,文件并不用来显示或者读取,就不用加这个
三、models.py文件中的写法
这个表的img是存的是文件保存的路径.
class Book(models.Model): name = models.CharField(max_length=32) date1 = models.DateTimeField(auto_now=True,null=True) date2 = models.DateTimeField(auto_now_add=True,null=True) img = models.ImageField(upload_to='img',null=True) #写上upload_to,后面指定一个路径,那么将来上传的文件会直接生成到配置文件中的那个medias文件夹中的img文件夹中,不需要我们自己写读取文件内容写入本地文件的操作,django内部帮我们自动处理了
四、views视图函数中的写法,上传一个图片:
from django.shortcuts import render,HttpResponse,redirect from app01 import models def index(request): if request.method == 'GET': return render(request,'index.html') else: username = request.POST.get('username') file_obj = request.FILES.get('file') print(file_obj) models.Book.objects.create( name = username, img = file_obj ) return render(request,'index.html')
五 在index.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="{% url 'index' %}" enctype="multipart/form-data" method="post"> {% csrf_token %} <div>用户名<input type="username" name="username"></div> <div>文件 <input type="file" name="file"></div> <div><input type="submit"></div> </form> </body> </html>
六通过页面将上传文件
七更新上传了的文件(注意,只是会更新数据库中那个字段保存的文件的路径,但是之前上传的文件是不会被自动删除的,需要我们自行再写逻辑来删除之前上传错的或者需要被覆盖的文件。还有就是如果上传的文件名称是相同的那么你会发现数据库中这个字段的路径后面的文件名称会出现一个乱起八糟的随机字符串,这是因为上传的文件名称冲突了,django为了解决这个冲突,给你改了一下你的文件名称。)
obj = models.Book.objects.get(name='111') obj.img=file_obj obj.save() #下面的update方法是不能更新正确更新保存的文件路径的,除非我们自己手动拼接文件路径,然后img=路径来进行update更新 models.Book.objects.filter(name='chao2').update(img=file_obj)
八 查看上传的文件:
from django.shortcuts import render,HttpResponse,redirect from app01 import models def index(request): objs = models.Book.objects.all() return render(request,'index.html',{'objs':objs})
九 html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> {% for obj in objs %} <img src="/media/{{ obj.img }}" alt=""> {% endfor %} </div> </body> </html>
在一次访问网页可以看到图片
上传同一个文件名的时候会出现文件名的乱码,暂时不知道怎么解决,没有写,想起来写吧