Django admin 自定义Field 上传文件到云 存储链接
简介
在工作碰到了需要快速搭建原型的事情,Django在后台数据管理这方面有完善的解决方案。
admin后台对models.FileField
的上传文件解决方式是直接在数据库中储存原始数据,对于数据库大小和迁移等都很不便,更多的解决方案是通过oss解决储存问题,cdn访问的方式提高速度。
所以需要对models.FileField
进行改造,使其自动上传到oss中并储存url地址。
找遍了网络只有一个对此的解决方案,但不完整(有其他方案的话在评论区告知一下)
使用环境:python 3.8.8 django 3.2.5
实现步骤
注:我使用的是腾讯云的oss,所以下面例子都以腾讯云为例,其他云端oss对应替换我标注的位置就可以
0、上传文件部分代码(隐私信息使用000000表示,自行替换)
1 | python复制代码from qcloud_cos import CosConfig |
1、自定义Widget
继承了forms.FileInput
,对页面输入文件进行接收
1 | python复制代码# -*-*-*-*-*- encoding: utf-8 -*-*-*-*- |
2、自定义Field
继承了models.URLField
,用来实现URL的处理
1 | python复制代码from django import forms |
3、自定义template
此处为自我摸索部分,有疑问请指出
在不使用自定义模板时,进入会报错找不到模板
翻阅源文件后发现在/lib/python3.8/site-packages/django/forms/templates/django/forms/widgets/file.html
,推测是读不到对应位置的file.html
于是自定义一个模板html,代码如下:(直接复制file.html的部分,处理掉一些不识别的问题)
1 | html复制代码<input type="{{ widget.type }}" name="{{ widget.name }}"{% if widget.value != None %} value="{{ widget.value }}"{% endif %}{% for name, value in widget.attrs.items %}{% if value is not False %} {{ name }}{% if value is not True %}="{{ value|stringformat:'s' }}"{% endif %}{% endif %}{% endfor %}>` |
最后一行为个人增加对已上传的文件显示支持,不知道之前的是什么问题无法进行显示,不需要的话可直接删除
4、使用自定义field
1 | python复制代码from customField.TencentField import TencentField |
5、其他
5.1 代码结构
5.2 使用效果
页面显示
数据库储存信息
参考文章地址:www.jianshu.com/p/0522aaae3…
本文转载自: 掘金