为了利用Django的ImageField和FileField格式实现多图,多文件上传,在网上找了好久,基本上不是代码不全,就是报错一堆,由于这种格式能够和django的admin相结合,很是不甘心,终于在今天结合多个demo演练成功了。html
时间有限先贴代码,有时间再详细写注释python
app结构,其中imgs_db是本次的多图上传,files_db是本次多文件上传mysql
基本工做:jquery
新建app,修改setting.py中的installed_app和静态路径,增长媒体路径sql
STATIC_URL = '/static/' STATICFILES_DIRS=( os.path.join(BASE_DIR,'static'), ) MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/') #设置静态文件路径为主目录下的media文件夹 MEDIA_URL = '/media/'
数据库若是是mysql的请新建好,设置页面修改(这里略)数据库
from django.db import models class Imgs(models.Model): id = models.AutoField(max_length=10, primary_key=True, verbose_name='id') img = models.ImageField(upload_to='./imgs/',verbose_name='图片地址') single = models.CharField(max_length=20,null=True, blank=True,verbose_name='图片名称') def __unicode__(self): # __str__ on Python 3 return (self.id,self.img) def __str__(self): return str(self.single) class Imgs_name(models.Model): id = models.AutoField(max_length=10, primary_key=True, verbose_name='id') name = models.CharField(max_length=10,verbose_name='图片库名称') imgs = models.ManyToManyField(Imgs, related_name='imgs',verbose_name='图片表') def __unicode__(self): # __str__ on Python 3 return (self.id,self.name,self.imgs) def __str__(self): return self.name
from django.http import HttpResponseRedirect from django.shortcuts import render,HttpResponse from imgs_db.models import Imgs_name,Imgs import random def up_imgs(request): return render(request, 'imgs_tem/up_imgs.html') def upload_imgs(request): ''' model拆分红2个表,其中一个为文件存储,一个为图集 图集对文件存储中须要有一个字段设置为多对多的储存关系 post后得到文件 先对图集实例化,增长其余字段应填写的值,对这个实例存储 再对多文件列表循环,对图片自己实例化,增长其余字段应填写的值,再对这个实例存储 最后添加图片对应图集的关系表保存 :param request: :return: ''' test = Imgs_name() test.name = 'test' + str(random.randint(100, 900)) test.save() for f in request.FILES.getlist('imgs'): print(f) empt = Imgs() # 增长其余字段应分别对应填写 empt.single=f empt.img=f empt.save() test.imgs.add(empt) # File(file=f, files=test,id=1).save() return HttpResponse('上传成功')
from django.contrib import admin # Register your models here. from imgs_db.models import Imgs,Imgs_name class img_up(admin.ModelAdmin): list_display = ('id','img','single') filter_horizontal = ('imgs',) admin.site.register(Imgs, img_up) class test_img_up(admin.ModelAdmin): list_display = ('id','name') admin.site.register(Imgs_name, test_img_up)
from django.contrib import admin from django.conf.urls.static import static from django.conf import settings from django.conf.urls import url from imgs_db import views as imgs_db urlpatterns = [ url(r'^admin/', admin.site.urls), # 多图,多文件上传 url(r'^up_imgs', imgs_db.up_imgs), url(r'^upload_imgs', imgs_db.upload_imgs), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>多图片上传</title> <script src="/static/js/jquery-1.8.3.min.js"></script> <style> label{width: 80%;padding: 10px 20px;display: block} label input{border: 1px solid #eee;padding: 10px 20px;margin-left: 20px} </style> </head> <body> <form action="upload_imgs" method="POST" enctype="multipart/form-data"> <label>项目打包图片<input type="file" name="imgs" multiple></label> <button type="submit">提交</button> </form> </body> </html>
注意form表单要填写enctype="multipart/form-data"django
文件input类型为file,支持多文件增长multipleapp
python manage.py migrate python manage.py makemigrations python manage.py migrate python manege.py createsuperuser#建立超级管理员,以后自行设置用户名密码
试验次数多了,发现migrate在makemigrations先后各作一次,能让数据库在屡次初始化后叫好用dom
同时上传2张图(有的时候会出现data too lang),须要把single字段长度变大post
发现文件已经上传到路径
访问:http://127.0.0.1:8222/admin/
发现文件上传位置,+能够继续添加,这里的1.png,2.png显示路径名称,是使用内置方法__str__()获得
有图单独增长的图片名称是靠增长single字段,而且使用内置方法__str__()获得(为了方便上传后对图片末尾加随机字符串串或者重命名而增长)
相应的,在view.py视图要增长对single的保存
固然点开后就能看到图片
from django.db import models class Files(models.Model): id = models.AutoField(max_length=10, primary_key=True, verbose_name='id') file = models.FileField(upload_to='./files/') def __unicode__(self): # __str__ on Python 3 return (self.id,self.file) class Files_name(models.Model): id = models.AutoField(max_length=10, primary_key=True, verbose_name='id') name = models.CharField(max_length=10) files = models.ManyToManyField(Files, related_name='files') def __unicode__(self): # __str__ on Python 3 return (self.id,self.name,self.files)
from django.http import HttpResponseRedirect from django.shortcuts import render,HttpResponse from files_db.models import Files_name,Files import random def up_files(request): return render(request, 'files_tem/up_files.html') def upload_files(request): test = Files_name() test.name = 'test' + str(random.randint(100, 900)) test.save() for f in request.FILES.getlist('files'): empt = Files() empt.file = f empt.save() test.files.add(empt) # File(file=f, files=test,id=1).save() return HttpResponse('上传成功')
from django.contrib import admin # Register your models here. from files_db.models import Files,Files_name class file_up(admin.ModelAdmin): list_display = ('id','file',) admin.site.register(Files, file_up) class test_up(admin.ModelAdmin): list_display = ('id','name') admin.site.register(Files_name, test_up)
from django.contrib import admin from django.conf.urls.static import static from django.conf import settings from django.conf.urls import url from files_db import views as files_db urlpatterns = [ url(r'^admin/', admin.site.urls), # 多图,多文件上传 url(r'^up_files', files_db.up_files), url(r'^upload_files', files_db.upload_files), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>多文件上传</title> <script src="/static/js/jquery-1.8.3.min.js"></script> <style> label{width: 80%;padding: 10px 20px;display: block} label input{border: 1px solid #eee;padding: 10px 20px;margin-left: 20px} </style> </head> <body> <form action="upload_files" method="POST" enctype="multipart/form-data"> <label>项目打包文件<input type="file" name="files" multiple></label> <button type="submit">提交</button> </form> </body> </html>
python manage.py migrate python manage.py makemigrations python manage.py migrate python manege.py createsuperuser#建立超级管理员,以后自行设置用户名密码
试验次数多了,发现migrate在makemigrations先后各作一次,能让数据库在屡次初始化后较好用
多文件上传未对名字进行修改,也没有多增长字段,为方便对比多图上传添加部分的显示效果
————————————————————————————————————————————
因为在创建model.py的时候对数据字段类型作了限制,此处应是图片的上传成非图片的文件,就会报错。
其余字段类型也是同样的。这就是django建立admin的好处,不用写增删改查,却都有,也能判断