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日

相关文章

  • OpenCV实现对象跟踪的方法

    下面是OpenCV实现对象跟踪的完整攻略: 1. 背景介绍 OpenCV是一个广泛使用的计算机视觉库,可以帮助我们处理图像和视频。对象跟踪可以在很多场景中使用,比如视频监控、机器人视觉、游戏等等。在本攻略中,我们将介绍如何使用OpenCV实现对象跟踪。 2. 实现步骤 2.1 加载视频 我们首先要从视频中获取每一帧图像。下面是使用OpenCV读取视频文件的代…

    人工智能概论 2023年5月25日
    00
  • Django ORM 常用字段与不常用字段汇总

    下面是关于”Django ORM常用字段与不常用字段汇总”的详细攻略。 什么是ORM ORM的全称是Object-Relational Mapping,即对象关系映射,是一种将对象与关系数据库映射的技术。通常情况下,一个类对应于关系数据库中的一个表,一个对象对应于其中的一条记录(一行),一些对象可以通过它们的属性直接引用其他对象,这样就允许我们在程序中使用对…

    人工智能概论 2023年5月25日
    00
  • docker挂载NVIDIA显卡运行pytorch的方法

    下面我将详细讲解”docker挂载NVIDIA显卡运行pytorch的方法”。 1. 安装NVIDIA驱动和docker 首先,我们需要在宿主机上安装NVIDIA的显卡驱动,以及在宿主机上安装docker。关于这两个软件的安装过程这里不再赘述,如果你还没有安装,请自行搜索相关教程。 2. 下载nvidia/cuda镜像 使用以下命令下载nvidia/cuda…

    人工智能概览 2023年5月25日
    00
  • 详解python架构 PyNeuraLogic超越Transformers

    详解Python架构 PyNeuraLogic超越Transformers 什么是PyNeuraLogic? PyNeuraLogic(PNL)是一个Python库,可以帮助用户构建和训练神经逻辑程序。PNL提供了一种新的机器学习范式,可以用来处理关系型数据,并进一步扩展Transformer框架。 PyNeuraLogic框架如何超越Transformer…

    人工智能概论 2023年5月25日
    00
  • Django def clean()函数对表单中的数据进行验证操作

    Django中的表单验证是在视图函数中使用的,在视图函数中,使用表单的is_valid()方法进行验证,但是有时候我们需要在表单类中对用户提交的数据进行进一步的自定义验证操作,这时候就需要使用到clean()函数。 clean()函数介绍 clean()函数是在django中的表单验证过程中定义的一个函数,可以对用户提交的数据进行自定义验证操作。clean(…

    人工智能概论 2023年5月25日
    00
  • 深入理解nginx如何实现高性能和可扩展性

    深入理解nginx如何实现高性能和可扩展性 Nginx 是一个高性能、高可靠性的 Web 服务器和反向代理服务器。在处理高并发网络请求时,它可以同时保持较高的稳定性和扩展性。以下是 Nginx 实现高性能和可扩展性的攻略: 1.事件驱动模型 Nginx 使用了事件驱动的模型,在单个进程中处理多个并发连接,从而避免了每个连接都创建一个新进程或线程的模型。这种模…

    人工智能概览 2023年5月25日
    00
  • python交互模式基础知识点学习

    Python交互模式基础知识点学习攻略 Python交互模式是Python解释器提供的一种交互式的Python开发环境。与传统的Python脚本开发不同的是,在Python交互模式中,用户可以直接在交互式界面中输入Python语句并立即看到它们的结果,这有助于Python初学者快速学习和掌握Python基础知识。下面是一些Python交互模式的基础知识点,以…

    人工智能概论 2023年5月25日
    00
  • Python通过Django实现用户注册和邮箱验证功能代码

    下面我将为您详细讲解“Python通过Django实现用户注册和邮箱验证功能代码”的完整攻略。 1. 环境搭建 在使用Django开发之前,需要先安装Python和Django。可以通过以下步骤来安装: 安装Python 对于Windows系统,可以在Python官网(https://www.python.org/downloads/)中下载安装包进行安装。…

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