Django Admin 上传文件到七牛云的示例代码

下面是关于“Django Admin 上传文件到七牛云的示例代码”的完整攻略:

1. 准备工作

首先,你需要完成以下准备工作:

  • 在七牛云上创建一个 Bucket,并获取相应的 Access Key 和 Secret Key;
  • 安装 qiniu 包:pip install qiniu
  • 在 Django 的 settings.py 文件中,设置相应的参数,如下所示:
# settings.py

QINIU_ACCESS_KEY = '<your-access-key>'
QINIU_SECRET_KEY = '<your-secret-key>'
QINIU_BUCKET_NAME = '<your-bucket-name>'
QINIU_BUCKET_DOMAIN = '<your-bucket-domain>'

2. 编写上传函数

接下来,你需要在 Django 的 admin.py 文件中编写上传函数,将文件上传到七牛云。例:

# admin.py

import qiniu
from django.conf import settings

def upload_to_qiniu(file, key):
    # 构建鉴权对象
    q = qiniu.Auth(settings.QINIU_ACCESS_KEY, settings.QINIU_SECRET_KEY)

    # 生成上传 Token,仅包含指定 key 的上传凭证
    token = q.upload_token(settings.QINIU_BUCKET_NAME, key)

    # 上传文件到七牛云
    ret, info = qiniu.put_data(token, key, file)

    # 返回文件在七牛云上的 URL
    return f'{settings.QINIU_BUCKET_DOMAIN}/{ret["key"]}'

该函数接收两个参数,一个是要上传的文件,另一个是文件在七牛云上的 key。函数内部使用了 qiniu 包提供的 upload_token 和 put_data 方法,将文件上传到七牛云,并返回上传后文件在七牛云上的 URL。

3. 在 admin.py 文件中使用上传函数

接下来,你可以在 Django Admin 的 Model 中使用上传函数,将上传按钮添加到 Admin 的表单中。例如:

from django.contrib import admin
from django.utils.html import format_html
from .models import MyModel
from .admin_utils import upload_to_qiniu

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields = ('display_image',)   # 将显示图片的字段设置为只读

    def display_image(self, obj):
        """
        返回对象对应的图片,并在后面添加一个上传按钮
        """
        if obj.image:
            return format_html(
                '<img src="{}" style="max-height: 200px;">'
                '<br><br><input type="file" name="{}">', obj.image, obj.image.name)
        else:
            return format_html('<input type="file" name="{}">', obj.image.name)

    def save_model(self, request, obj, form, change):
        """
        保存 Model 前,将图片上传到七牛云
        """
        if obj.image:
            key = f'uploads/{obj.image.name}'
            obj.image_url = upload_to_qiniu(obj.image.read(), key)
        super().save_model(request, obj, form, change)

admin.site.register(MyModel, MyModelAdmin)

在这个示例中,我们在 MyModelAdmin 中定义了一个名为 display_image 的函数,用于显示上传的图片,并在后面添加上传按钮。同时,我们还定义了一个 save_model 的方法,在保存 Model 前,将图片上传至七牛云,并将上传后的图片 URL 存储到 image_url 字段中。

另外,我们需要将 image_url 字段添加到 Model 中,并在 display_image 中引用该字段:

# models.py

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=20)
    image = models.ImageField(upload_to='uploads/', blank=True, null=True)
    image_url = models.CharField(max_length=255, blank=True, null=True)

    def __str__(self):
        return self.name

这样,我们就实现了将图片上传到七牛云的功能。在 Django Admin 的表单中,用户可以先选择本地的图片文件,然后点击上传按钮,将图片上传到七牛云,并将上传后的 URL 保存到 Model 的 image_url 字段中。

当用户访问该 Model 时,将显示上传的图片,并提供重新上传的功能。

示例说明

示例1

以下代码演示了如何将一个文件上传到七牛云,并返回文件在七牛云上的 URL:

import qiniu
from django.conf import settings

def upload_to_qiniu(file, key):
    # 构建鉴权对象
    q = qiniu.Auth(settings.QINIU_ACCESS_KEY, settings.QINIU_SECRET_KEY)

    # 生成上传 Token,仅包含指定 key 的上传凭证
    token = q.upload_token(settings.QINIU_BUCKET_NAME, key)

    # 上传文件到七牛云
    ret, info = qiniu.put_data(token, key, file)

    # 返回文件在七牛云上的 URL
    return f'{settings.QINIU_BUCKET_DOMAIN}/{ret["key"]}'

该函数首先构建了一个鉴权对象,并使用该对象生成上传 Token,仅包含指定 key 的上传凭证。然后,使用 put_data 方法将文件上传到七牛云,最后返回文件在七牛云上的 URL。

示例2

以下代码演示了如何将图片上传到七牛云,并在 Django Admin 中显示上传的图片:

from django.contrib import admin
from django.utils.html import format_html
from .models import MyModel
from .admin_utils import upload_to_qiniu

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields = ('display_image',)   # 将显示图片的字段设置为只读

    def display_image(self, obj):
        """
        返回对象对应的图片,并在后面添加一个上传按钮
        """
        if obj.image:
            return format_html(
                '<img src="{}" style="max-height: 200px;">'
                '<br><br><input type="file" name="{}">', obj.image, obj.image.name)
        else:
            return format_html('<input type="file" name="{}">', obj.image.name)

    def save_model(self, request, obj, form, change):
        """
        保存 Model 前,将图片上传到七牛云
        """
        if obj.image:
            key = f'uploads/{obj.image.name}'
            obj.image_url = upload_to_qiniu(obj.image.read(), key)
        super().save_model(request, obj, form, change)

admin.site.register(MyModel, MyModelAdmin)

该示例中定义了一个 MyModelAdmin 类,用于 Django Admin 的显示和操作。其中,display_image 函数用于显示上传的图片,并添加一个上传按钮;save_model 函数在保存 Model 前将图片上传到七牛云,并将上传后的 URL 存储到 image_url 字段中。最后,我们将 MyModelAdmin 注册到 Django Admin 中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django Admin 上传文件到七牛云的示例代码 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Nginx防盗链与服务优化配置的全过程

    下面我将详细讲解“Nginx防盗链与服务优化配置的全过程”的完整攻略。本攻略分为以下几个步骤: 安装Nginx 首先需要安装Nginx。如果你是使用Linux系统,则可以使用该系统的包管理器进行安装;如果你正在使用Windows,则可以从Nginx官网下载安装包进行安装。 配置Nginx 在安装完成后,需要对Nginx进行配置。这里主要分为两个部分:防盗链和…

    人工智能概览 2023年5月25日
    00
  • C++ OpenCV绘制简易直方图DrawHistImg

    下面是对于C++ OpenCV绘制简易直方图的完整攻略。 什么是直方图? 直方图是一种图表,用于表示数据集中各元素频度分布情况的统计表。在计算机视觉中,直方图一般用来表示一幅图像中各个像素值所占的比例。 OpenCV绘制简易直方图的函数 在OpenCV中,我们可以使用 cv::calcHist 函数来计算图像的直方图,然后使用 cv::normalize 函…

    人工智能概论 2023年5月25日
    00
  • MongoDB中方法limit和skip的使用

    MongoDB是一款非常流行的非关系型数据库,在进行数据查询的时候,使用limit和skip方法可以让我们得到更加精确的搜索结果。 一、limit方法的使用 limit方法可以限制查询结果返回的文档数量,语法格式如下: db.collection.find().limit(x) 其中,db.collection表示需要查询的集合,find()表示查询该集合中…

    人工智能概论 2023年5月25日
    00
  • redis集群搭建过程(非常详细,适合新手)

    下面我将详细讲解 redis 集群搭建过程。 1. 环境准备 首先需要准备一台或多台主机,安装 redis 服务。本次搭建使用的操作系统为 CentOS 7.8,redis 版本为 5.0.9。 2. 下载、安装和配置 redis 下载安装 # 安装前依赖包 $ yum install gcc -y $ yum install tcl -y # 下载 Red…

    人工智能概览 2023年5月25日
    00
  • Django超详细讲解图书管理系统的实现

    Django超详细讲解图书管理系统的实现 1. 总体介绍 本篇攻略介绍如何使用Django框架实现一套图书管理系统,主要包括以下几个方面的内容: 数据库设计和使用 Django框架的基本使用 图书管理系统的具体实现 2. 数据库设计 本系统涉及的核心数据有图书、作者、出版社、客户等。我们需要先设计出数据库,并使用Django的ORM对其进行操作。 根据需求,…

    人工智能概览 2023年5月25日
    00
  • Python一行代码识别发票并保存Excel示例详解

    下面是关于“Python一行代码识别发票并保存Excel示例详解”这个主题的详细讲解攻略。 一、概述 这篇文章主要介绍了如何使用Python代码识别发票信息并保存到Excel中。使用OCR技术识别出图片中的文字,并使用正则表达式进行匹配提取出发票的相关信息,最后将提取出的信息保存到Excel文件中。 二、实现步骤 1. 安装依赖包 使用Python代码处理图…

    人工智能概论 2023年5月25日
    00
  • django中使用memcached示例详解

    这里是一份“django中使用memcached示例详解”的攻略。 什么是Memcached Memcached是一种分布式内存缓存系统,用于缓存数据和对象。它通常被用来加速动态Web应用程序,减少数据库负载和提高网站的响应时间。Memcached可以被应用于许多编程语言和Web应用程序框架中,包括Django。 Django中使用Memcached Dja…

    人工智能概览 2023年5月25日
    00
  • Pytorch中torch.flatten()和torch.nn.Flatten()实例详解

    介绍:在PyTorch中,PyTorch提供了两个函数:torch.flatten和torch.nn.Flatten用于将多维张量转换为一维张量。然而它们之间的实现方式和特点略有不同。 Torch.flatten() torch.flatten(input, start_dim=0, end_dim=-1)函数用于将一个输入的多维形状张量展平成形状为“1D”…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部