前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python+Django+mysql多图,多文件上传(包含admin)

python+Django+mysql多图,多文件上传(包含admin)

作者头像
晓歌
发布2018-08-15 15:06:43
2.6K0
发布2018-08-15 15:06:43
举报
文章被收录于专栏:破晓之歌破晓之歌

为了利用Django的ImageField和FileField格式实现多图,多文件上传,在网上找了很久,基本上不是代码不全,就是报错一堆,因为这种格式可以和django的admin相结合,非常不甘心,终于在今天结合多个demo演练成功了。

时间有限先贴代码,有时间再详细写注释

app结构,其中imgs_db是本次的多图上传,files_db是本次多文件上传

基本工作:

新建app,修改setting.py中的installed_app和静态路径,增加媒体路径

代码语言:javascript
复制
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的请新建好,设置页面修改(这里略)

一、多图上传

1.models.py

代码语言:javascript
复制
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

2. view.py

代码语言:javascript
复制
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('上传成功')

3.admin.py

代码语言:javascript
复制
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)

4.urls.py

代码语言:javascript
复制
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)

5.静态页面

代码语言:javascript
复制
<!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"

文件input类型为file,支持多文件增加multiple

6.初始化数据库,建立模型

代码语言:javascript
复制
python manage.py migrate
python manage.py makemigrations
python manage.py migrate
python manege.py createsuperuser#创建超级管理员,之后自行设置用户名密码

试验次数多了,发现migrate在makemigrations前后各做一次,能让数据库在多次初始化后叫好用

7.访问

同时上传2张图(有的时候会出现data too lang),需要把single字段长度变大

发现文件已经上传到路径

访问:http://127.0.0.1:8222/admin/

发现文件上传位置,+可以继续添加,这里的1.png,2.png显示路径名称,是使用内置方法__str__()得到

有图单独增加的图片名称是靠增加single字段,并且使用内置方法__str__()得到(为了方便上传后对图片末尾加随机字符串串或者重命名而增加)

相应的,在view.py视图要增加对single的保存

当然点开后就能看到图片

二、多文件上传

1.models.py

代码语言:javascript
复制
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)

2. view.py

代码语言:javascript
复制
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('上传成功')

3.admin.py

代码语言:javascript
复制
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)

4.urls.py

代码语言:javascript
复制
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)

5.静态页面

代码语言:javascript
复制
<!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>

6.初始化数据库,建立模型

代码语言:javascript
复制
python manage.py migrate
python manage.py makemigrations
python manage.py migrate
python manege.py createsuperuser#创建超级管理员,之后自行设置用户名密码

试验次数多了,发现migrate在makemigrations前后各做一次,能让数据库在多次初始化后较好用

7.访问

多文件上传未对名字进行修改,也没有多增加字段,为方便对比多图上传添加部分的显示效果

————————————————————————————————————————————

由于在建立model.py的时候对数据字段类型做了限制,此处应是图片的上传成非图片的文件,就会报错。

其他字段类型也是一样的。这就是django创建admin的好处,不用写增删改查,却都有,也能判断

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、多图上传
    • 1.models.py
      • 2. view.py
        • 3.admin.py
          • 4.urls.py
            • 5.静态页面
              • 6.初始化数据库,建立模型
                • 7.访问
                • 二、多文件上传
                  • 1.models.py
                    • 2. view.py
                      • 3.admin.py
                        • 4.urls.py
                          • 5.静态页面
                            • 6.初始化数据库,建立模型
                              • 7.访问
                              相关产品与服务
                              云数据库 SQL Server
                              腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档