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日

相关文章

  • 在Django中进行用户注册和邮箱验证的方法

    在Django中进行用户注册和邮箱验证的方法可以分为以下几个步骤: 安装所需要的包 Django自带的认证模块不支持邮箱验证,需要安装第三方包进行扩展。常用的包有django-registration和django-allauth,可以通过pip进行安装。 示例代码: //安装django-registration pip install django-re…

    人工智能概论 2023年5月25日
    00
  • C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

    针对“C#中如何将MongoDB->RunCommand结果映射到业务类”的问题,我来给你提供一个完整的攻略: 1. 获取MongoDB->RunCommand的结果 首先,我们需要获取MongoDB的RunCommand方法的执行结果,可以通过以下的代码来实现: var commandResult = await mongoDatabase.R…

    人工智能概论 2023年5月25日
    00
  • django 自定义过滤器(filter)处理较为复杂的变量方法

    以下是“django 自定义过滤器(filter)处理较为复杂的变量方法”的完整攻略。 1. 理解django过滤器(filter) 在Django中,过滤器(filter)是用于对变量进行处理的工具,它可以使用管道(pipeline)将一个变量传递给另一个变量,并通过一系列的过滤器处理它们。Django的模板系统提供了一些内置的过滤器,如{{ variab…

    人工智能概论 2023年5月25日
    00
  • Nginx服务器上搭建图片缓存服务的基本配置解析

    以下是“Nginx服务器上搭建图片缓存服务的基本配置解析”的详细攻略。 1. 基本概念解析 Nginx服务器 Nginx是一款高性能的Web服务器,也可作为反向代理服务器、负载均衡服务器以及HTTP缓存服务器等使用。通过配置Nginx服务器,可实现对Web应用程序的代理、负载均衡、缓存加速等功能。 图片缓存服务 图片缓存服务指的是将图片缓存在服务器中,在用户…

    人工智能概览 2023年5月25日
    00
  • Python 利用OpenCV给照片换底色的示例代码

    首先,为了实现给照片换底色,我们需要使用到 Python 图像处理库——OpenCV。接下来,让我们分步骤讲解实现过程: 步骤一:安装OpenCV 在命令行中输入以下命令: pip install opencv-python 步骤二:导入库并读取图片 import cv2 # 读取原图 img = cv2.imread(‘your_image.jpg’) 步…

    人工智能概览 2023年5月25日
    00
  • Mac OS下PHP环境搭建及PHP操作MySQL常用方法小结

    Mac OS下PHP环境搭建及PHP操作MySQL常用方法小结 环境搭建 由于Mac OS自带了Apache和PHP,我们只需要安装MySQL即可。 安装MySQL步骤: 下载MySQL安装包https://dev.mysql.com/downloads/mysql/; 运行安装包,按照提示进行安装; 安装完成后,启动MySQL服务:打开终端,输入mysql…

    人工智能概览 2023年5月25日
    00
  • 从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析

    从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析 介绍 在 Node.js 应用程序开发中,数据库是经常使用的一种数据存储方式。Node.js 支持的数据库种类众多,常见的包括 SQLite3 和 MongoDB。 本教程会从零开始,向大家介绍如何在 Node.js 中使用 SQLite3 和 MongoDB,以及它们在 Node.…

    人工智能概览 2023年5月25日
    00
  • Django工程的分层结构详解

    下面我会详细讲解“Django工程的分层结构详解”的完整攻略。 1. 概述 Django工程采用MVC的分层结构,将整个项目分为了模型(Model)、视图(View)和控制器(Controller)三层。此外,Django还加入了一个名叫模板(Template)的层,用于处理网页的渲染。 从模型层开始,我们逐层向上介绍各层的作用及其文件夹结构。 2. 模型层…

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