下面是关于“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技术站