首页 > 其他分享 >Django - admin 表单编辑页面,增加自定义功能,前端上传视频到oss

Django - admin 表单编辑页面,增加自定义功能,前端上传视频到oss

时间:2024-01-29 19:56:21浏览次数:18  
标签:form 自定义 admin oss Django video change 页面

# 背景:可以在admin编辑页面原有基础上,增加一些可定制的功能,如:在本地上传图片到oss,减少服务器的带宽压力,下面就以此为例。

示例图:

 

 

一。models.py

# video 可以直接用字符串存储,因为最终里面只有有一串oss的视频路径

class News(models.Model):
    OSS_URL = 'https://xxxx.aliyuncs.com'
video = models.FileField(verbose_name="视频", upload_to="news/video")

 

二。admin.py

@admin.register(News)
class NewsAdmin(admin.ModelAdmin):
    list_display = ('id', 'video')

    # 覆盖内置的编辑页面,增加自定义页面(继承原有页面的所有内容,并增加自定义内容)
    # 该页面存放在 /templates/admin/ 目录下
    change_form_template = 'admin/addfile.html'

    def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):

        # 可设置字段,通过模板语言显示到 addfile.html 页面中
        context['accessKeyId'] = '111'
        context['accessKeySecret'] = '222'

        if obj and obj.video:
            context['video_url'] = News.OSS_URL+obj.video.url
        return super(ZhongYeGuanZhuAdmin, self).render_change_form(request, context, add, change, form_url, obj)

    def save_model(self, request, obj, form, change):
        # 拿到前端返回的oss视频地址, 并存入数据库
        video = request.POST.get('video')
        if video:
            obj.video = video
        super().save_model(request, obj, form, change)

 

三。addfile.html

# 1. 页面继承了原有编辑面的内容,并加入了自己的代码进去

# 2. 请注意页面引入了 layui.css,layui.js,aliyun-oss-sdk.js,format.js 多个库

# 3. 请注意页面中的 js 代码需要引入 django.jQuery 才会生效

<link rel="stylesheet" href="xxx.aliyuncs.com/layui/css/layui.css" media="all">

{% extends 'admin/change_form.html' %}
{% load static %}

{% block admin_change_form_document_ready %}
{{ block.super }}

<style>
    #up_{
        margin-left: 30px;
        display: inline-block;
        width: 60px; height: 30px;
        text-align: center; line-height: 30px;
        background: green;
        color: #fff !important;
    }
</style>

<script src="http://xxx.aliyuncs.com/layui/layui.js"></script>
<script src="https://xxx.aliyuncs.com/js/aliyun-oss-sdk-6.16.0.min.js"></script>
<script src="http://xxx.aliyuncs.com/js/date.format.js"></script>

<script>

(function($) {
{% if video_url %} $('.field-video .file-upload a')[0].href = '{{ video_url }}'; {% endif %} $("#id_video").before('<input type="hidden" name="video" id="video">'); $("#id_video").after('<a href="javascript:;" id="up_">上传视频</a>'); var loading; async function upload_to_oss(file_, mulu){ // 设置加载 loading = layer.load(2, { shade: 0.4 }); let client = new OSS({ region: "oss-cn-beijing", accessKeyId: "{{ accessKeyId }}", accessKeySecret: "{{ accessKeySecret }}", stsToken: "", bucket: "testz", }); // 将文件上传oss const options = { // 获取分片上传进度、断点和返回值。 progress: (p, cpt, res) => { console.log(p); }, // 设置并发上传的分片数量。 parallel: 4, // 设置分片大小。默认值为1 MB,最小值为100 KB。 partSize: 1024 * 1024, // headers, // 自定义元数据,通过HeadObject接口可以获取Object的元数据。 meta: { year: 2024 }, mime: "text/plain", } let lujing = mulu + Date.now()+'-'+file_.name; try { // 分片上传。 const res = await client.multipartUpload('/media'+lujing, file_, { ...options, }); return {'file_name': lujing} } catch (err) { console.log(err); layer.close(loading); return {'error': '上传失败, 请稍后再试'} } } $("#up_").click(async function () { let id_video = $("#id_video")[0].files; console.log('id_video >', id_video) if(id_video.length <= 0){ layer.msg('请选择视频文件'); return false; } let file = id_video[0]; console.log('file >', file) await upload_to_oss(file, '/{{ upload_to }}/').then(function (data) { layer.close(loading); if(data.error){ layer.msg(data.error); return false; } let f_name = data.file_name; $("#video").val(f_name); layer.msg('上传成功'); }); }) })(django.jQuery); </script> {% endblock %}

 

标签:form,自定义,admin,oss,Django,video,change,页面
From: https://www.cnblogs.com/chaoqi/p/17987912

相关文章

  • C# 使用自定义特性标注类的方法,直接在当前类中让Main函数调用它
    有的时候我们想要再Main执行一些代码,如果直接在里面写的话,下次再想用的时候就会把之前的代码删掉,好不容易写的代码不想删掉于是我们可以将这些代码写到类文件中,想要执行了,就在Main中调用该类的方法,但是有的时候我们又懒的去Main函数指定的,有没有什么办法能直接在新类中就能指定......
  • Django 中使用ModelForm生成HTML标签
    在Django中,使用ModelForm来生成HTML表单标签是一种常见且高效的做法。ModelForm可以自动根据模型的字段生成对应的表单字段,这大大简化了表单的创建和处理过程。以下是如何在Django中使用ModelForm来生成HTML标签的基本步骤:步骤1:创建ModelForm首先,你需要为你的模型......
  • 06django
    神奇的双下划线查询#1.查询年龄大于20的用户#res=models.User.objects.filter(age__gt=20)#print(res)"""__gt大于__lt小于__gte大于等于__lte小于等于"""#2.查询年龄是18、22、25的用户#res=models.......
  • 【如何更新自定义IP】自定义IP 的.V文件修改以后,一定要先进入platform Designer更新IP
    最近自定义了一个IP,添加到qsys以后,generateHDL....。再后来再有改动IP的.v文件时,我直接点generateHDL...发现电路最终没有更新。 需要如下操作:先进入platformDesigner更新IP,右击选择IP选择Edit: 点击分析和综合IP文件:  以后再generateQsy文件: 这样工程的......
  • 怎样用流程自定义表单提升办公效率?
    如果想要提升办公协作效率,可以试试低代码技术平台及流程自定义表单工具。不可否认的是,随着社会的进步和发展,传统的表单制作工具已经没有办法再满足业务量不断上涨的办公需求了,但是,借助专业的流程自定义表单工具就能很好地满足业务需求,实现高效式办公发展。那么,为什么现在低代码技......
  • layuiAdmin动态生成菜单并递归显示
    先给出菜单请求回来的json格式:除去外面的code和msg外,data内容是一个[]数组;每个数组里面是一个对象;有4个参数,一个标题(title),一个图标(icon),一个请求地址(url),最后还可能有个子集(list)。{"code":0,"msg":"","data":[{"title":"一级滑块组件","icon&q......
  • 利用Mybatis拦截器实现自定义的ID自增器
    原生的Mybatis框架是没有ID自增器,但例如国产的MybatisPlus却是支持,不过,MybatisPlus却是缺少了自定属性的填充;例如:我们需要自定义填充一些属性,updateDate、createDate等,这时MybatisPlus自带的ID自增器就无法满足需求;这种时候我们就需要自定义的ID增加器,可以自定义ID增长策略同时......
  • 自定义httpServletRequestWrapper导致上传文件请求参数丢失
    问题背景项目是SpringBoot单体式,在项目中,为了实现调用controller请求的日志记录功能。因此做了以下配置:创建自定义拦截器LogInterceptor;因为需要使用到流获取请求参数,解决流只能读一次问题,所以需要自定义HttpServletRequestWrapper;需要使得自定义HttpServletRequestW......
  • firefox 怎么自定义搜索引擎
     后面使用的时候,发现Firefox不能自定义搜索引擎了。从baidu、知乎上面搜索的结果,大部分都是打非所问的,不知道偏到哪里了。从stack上面找到的答案,记录一下 1、地址栏打开about:config2、搜索browser.urlbar.update2.engineAliasRefresh3、点击右侧的+4、现在,当您转到“......
  • vue3使用自定义指令实现图片懒加载
    //自定义指令app.directive('lazy',{mounted(el,binding){//绑定的元素,绑定的值//IntersectionObserver可以用来自动监听元素是否进入了设备的可视区域之内,而不需要频繁的计算来做这个判断constobserve=newIntersectionObserver(([{isIntersec......