Django基础笔记10(前端展示)
Ajax使用
$.ajax({
url:xxx,
type:xxx,
dadaType:xxx,
data:{...}
})
$.post(url,data,callbackFunction,dataType)//直接将参数内容写入,无需进行标注那个是data,那个是url
$.get() //同上
Ajax发送请求
$(document).ready(function () {
initFunc();
});
function initFunc() {
$.ajax({
url: '{% url 'getmenu' request.project.id %}',
type: 'GET',
dataType: "JSON",
data:{'key':value}
})
function (ind, data) {
//console.log(data)
//用value:{id: 4, title: "fdsaf", parent_id: 2}, {id: 5, title: "fdsaffdsafsdfsad", parent_id: 3}
//用value_list:[1, "Java", null]
if (!data.parent_id) {//根节点
var roLI = $('<li>').attr('id', 'id_' + data.id).append($('<a>').text(data.title)).append($('<ul>'))
$('#root').append(roLI)
}
else {
var id = '#id_' + data.parent_id; //找父标签
//找父标签下的ul,添加li和a标签后再加ul
$(id).children('ul').append(($('<li>').attr('id', 'id_' + data.id)).append($('<a>').text(data.title)).append($('<ul>')))
}
}
Ajax与后端配合
TYPE1
$.ajax({
...
data:{'name':11,'age':12,xx:[1,2,3]}
})
TYPE2
$.ajax({
...
data:{'name':JSON.stringfy({k1:1,k2:2},xx:[1,2,[1,2,3],3]})
})
TYPE1
request.POST.get('name')
request.POST.get('age')
request.POST.getlist('xx')
TYPE2
data=json.loads(request.body.decode('utf-8))
data['name'],data[xx]
<a data-toggle="modal" data-name="{{ i.fileName }}" data-id="{{ i.id }}"
data-target="#editModal" type="button"
class="btn btn-default" onclick="editName(this)"
><i class="fa fa-pencil-square-o fa-lg" aria-hidden="true"></i></a>
<a>删除</a></td>
<script>
function editName(th) {
var name = $(th).attr('data-name')
var myID = $(th).attr('data-id')
$('#editDiv').find('input:first').val(name)//找到第一个input框
}
</script>
在Django中应用markdown编辑器
设置markdown编辑器
- 找到需要引用编辑器的地区(textarea)
将textarea
→
\rightarrow
→markdown编辑器
- 下载markdown
- 下载后将文件解压至项目的静态文件夹
-
引入
<link rel="stylesheet" href="/static/web项目的markdown组件/editor.md-master/css/editormd.min.css">
<script src="/static/web项目的markdown组件/editor.md-master/editormd.min.js"></script>
-
初始化markdown编辑器
$(document).ready(function () {
initMarkDown();
});
function initMarkDown() {
editormd('editor', { //editor是textarea所在的div的id
//设置编辑器的一些参数
placeholder: '请输入内容',
height: 500,
path: '/static/markdown_of_web/editor.md-master/lib/' //依赖组件(必填)
imageUpload: true,//支持本地文件上传
imageFormats: ['jpg', 'jpeg', 'png', 'bmp', 'gif'],
imageUploadURL:doc_url,
var doc_url='{% url "docUpload" project_id=request.project.id %}'//设置图片上传路径
htmlDecode:true,//支持H5标签
})
}
后台接收
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt#接收的view要加上此装饰器,防止跨域打开连接被拦截
pic = request.FILES.get('editormd-image-file') # 获取图片对象
ext = pic.name.split('.')[-1] # 文件扩展名
result = {
'success': 1,
'message': None,
'url': im_url
}
return HttpResponse(json.dumps(result))#使前台可以接收到上传图片的连接
X-Frame-Options有三个选项:deny,sameorigin ,allow-from
分别表示禁止任何其他页面的嵌套,允许同域嵌套,允许指定域嵌套
还要设置全屏效果
.editormd-fullscreen {
z-index: 1001;
}
- 效果

预览markdown
- 引入
<link rel="stylesheet" href="/static/markdown_of_web/editor.md-master/css/editormd.preview.min.css">
<script src="/static/markdown_of_web/editor.md-master/editormd.min.js"></script>
<script src="/static/markdown_of_web/editor.md-master/lib/marked.min.js"></script>
<script src="/static/markdown_of_web/editor.md-master/lib/prettify.min.js"></script>
<script src="/static/markdown_of_web/editor.md-master/lib/flowchart.min.js"></script>
<script src="/static/markdown_of_web/editor.md-master/lib/jquery.flowchart.min.js"></script>
<script src="/static/markdown_of_web/editor.md-master/lib/raphael.min.js"></script>
<script src="/static/markdown_of_web/editor.md-master/lib/sequence-diagram.min.js"></script>
<script src="/static/markdown_of_web/editor.md-master/lib/underscore.min.js"></script>
- 将需要展示的文本放入textarea和div中
<div id="previewMarkdown">
<textarea>{{ doc_obj.content }}</textarea>
</div>
$(document).ready(function () {
initPreviewMarkdown();
});
function initPreviewMarkdown() {
editormd.markdownToHTML('previewMarkdown', {
htmlDebode: 'style,script,iframe',//过滤这些
})
}
- 效果

编辑器实现markdown上传图片的功能
function initMarkDown() {
editormd('editor', {
placeholder: '请输入内容',
height: 500,
path: '/static/markdown_of_web/editor.md-master/lib/', //依赖组件(必填)
imageUpload: true,
imageUploadURL: doc_url,//接收图片的url
imageFormats: ['jpg', 'jpeg', 'png', 'bmp', 'gif'],
htmlDecode: true,
toolbarIcons: function () {
return ["undo", "redo", "|", "bold", "hr", "|", "preview", "watch", "|", "fullscreen", "info", "testIcon", "testIcon2", "file", "faicon", "||", "watch", "fullscreen", "preview", "testIcon", "file"]//自定义工具栏上的按钮
}
})
}
自定义工具栏的效果

pic = request.FILES.get('editormd-image-file', None) # 获取图片对象
# 返回数据的结构,须转化为JSON类型
result = {
'success': 1,
'message': None,
'url': im_url#图片的连接
}
# 视图函数必须加上这两个装饰器,
@csrf_exempt #图片是以post形式进行提交,所以Django会进行从csrf验证
@xframe_options_exempt #图片的的跨域显示,不设置跨域访问限制
文件目录的结构展示
示例:
| ID | 所属项目ID | 文件/文件夹名 | 类型(文件(夹)) | 大小 | 父目录ID | key |
|---|---|---|---|---|---|---|
| 1 | 1 | 歌曲 | 1 | null | null | null |
| 2 | 1 | 难忘今宵.mp3 | 2 | 50MB | 1 | jklfad.mp3 |
folderID = request.GET.get('folder') #获取当前访问的文件夹的id
if request.method == 'GET': # 展示当前目录下的文件和文件夹
if folderID and folderID.isdecimal():
parent_obj = models.File.objects.filter(id=folderID, fileType=0, project=request.project).first() # 找到父文件夹
files = models.File.objects.filter(project=request.project, parent_id=folderID).order_by(
'fileType')
while parent_obj:
parentFolder.insert(0, {'id': parent_obj.id, 'name': parent_obj.fileName})
parent_obj = parent_obj.parent # 找到所有的父目录
else:
files = models.File.objects.filter(project=request.project, parent_id=None).order_by(
'fileType') # 按照type从小到大,文件夹在前,文件在后
# 当没传递参数folder时,默认访问根目录
文件上传模块
<style>
#filDiv {
height: 40px;
float: right;
width: 100px;
margin-right: 15px;
}
#filDiv > button {
width: 100px;
height: 35px;
}
#filDiv > input {
opacity: 0;
position: absolute;
overflow: hidden;
width: 80px;
}
<style>
<div id="filDiv">
<input type="file" multiple/>
<button class="btn btn-success" type="button">
<i class="fa fa-cloud-upload" aria-hidden="true"></i> 文件上传
</button>
</div>
<script>
function initUploadBtn() {
$('#fileUploadBtn').change(function () {
var fileList = $(this)[0].files;
$.each(fileList, function (index, fileObj) {
console.log(fileObj.name)//fileObj就是文件对象,可以批量上传
//读取文件内容
var myfile = new FileReader();
myfile.readAsBinaryString(fileObj, 'utf-8')
myfile.onload = function (evt) {
console.log(evt.target.result)
}
})
})
}
</script>
实现时间选择器
<link href="https://cdn.bootcdn.net/ajax/libs/bootstrap-datepicker/1.9.0/css/bootstrap-datepicker.min.css"
rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/bootstrap-datepicker/1.9.0/js/bootstrap-datepicker.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/bootstrap-datepicker/1.9.0/locales/bootstrap-datepicker.zh-CN.min.js"></script>
<script>
$(function () {
initDate();
})
function initDate() {
$('#id_end_time').datepicker({ //先找到时间input框
format: 'yyyy-mm-dd',
startData: '0',
language: 'zh-CN',
autoclose: true
});
$('#id_start_time').datepicker({
format: 'yyyy-mm-dd',
startData: '0',
language: 'zh-CN',
autoclose: true
});
}
</script>
利用bootstrap-select实现多选框
<link href="/static/bootstrap-select/bootstrap-select.min.css" rel="stylesheet">
<script src="/static/bootstrap-select/bootstrap-select.min.js"></script>
给select框添加这两个class
'assign': widgets.Select(attrs={'class': 'selectpicker','multiple':"multiple"}),
效果

相关使用
Django基础笔记10(前端展示)的更多相关文章
- Django结合Echarts在前端展示数据
前言 最近在用Django写UI自动化测试平台,基本快要弄完了,但是首页只有项目列表展示,一直感觉很空旷,所以想把一些关键数据在首页展示出来. 这时就想到利用Echarts这个开源项目,但是Djang ...
- Django 基础笔记补充
1.目录文件 django-admin.py startproject mydj cd mydj python manage.py startapp myapp 后生成目录: mydj/ ├── ...
- Django基础笔记
1.准备工作 .虚拟环境设置 python3 pip install virtualenv python -m venv env(虚拟环境文件名) env\Scripts\activate pip i ...
- 基础笔记10(IO 1.7try-with-resource) 装饰模式
1.读写的类型分为字节流和字符流,字节流一般是视频音频其他所有的类型都可以. (非文档文件使用字符流易造成未知编码(?)错误) InputStream OutputStream 抽象类 fileInp ...
- 黑马程序员_java基础笔记(10)...JDK1.5的新特性
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1:静态导入.2:for—each循环.3:自动装箱/拆箱.4:可变参数.5:枚举 ...
- 巨蟒django之权限9:前端展示修改删除合并&&权限展示
1.权限组件控制流程(硬核重点) 2.权限组件控制流程 3.角色管理 4.删除合并 5.权限展示
- Java基础笔记10
类的设计分析: 1.根据需求抽取属性.(名词几乎都是属性) 2.属性私有化(private) 3.生成setter和getter方法 4.可以根据需要添加构造函数. 5.根据需求抽取其他方法.(动词几 ...
- 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分
老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/guobaoyuan/ 开哥blog: https://home.cnblogs.com/u ...
- 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分
老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分 老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/gu ...
- 【笔记】Django基础(一)
---恢复内容开始--- [笔记]Django基础(一) oldboy Django 一 关于Python框架的本质 1. HTTP协议消息的格式: 请求(request) 请求方法 路径 HTTP ...
随机推荐
- keycloak~资源的远程授权
17.1远程资源授权准备 17.1.1认证和访问流程图 参考:http://www.zyiz.net/tech/detail-141309.html 17.1.2为用户指定角色 可以使用ROLE_US ...
- CentOS使用yum方式安装yarn和nodejs
# 使用epel-release.repo源安装的nodejs版本是6.17.1,有些前端项目使用的话会提示版本太低,具体下图 # 命令执行后的详细情况:curl -sL https://rpm.no ...
- Service概述
为何需要 Service Kubernetes 中 Pod 是随时可以消亡的(节点故障.容器内应用程序错误等原因).如果使用 Deployment 运行您的应用程序,Deployment 将会在 Po ...
- Persistent data structure 不可变数据结构
持久性变数据不要和持久储存相混淆 在计算机中持久性数据或非临时数据是一种数据结构,在修改时始终保持其自身的先前版本.这些数据实际上是不可变的,因为对这类数据操作不会明显的改变数据结构,而是始终产生新的 ...
- C语言------循环结构I
文章目录 1 .实训名称 2 .实训目的及要求 3 .源代码及运行截图 4 .小结 1 .实训名称 实训5:循环结构I 2 .实训目的及要求 1 .熟练掌握while.do-while和for语句实现 ...
- C语言经典编程100题
程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1 ...
- python更改文件后缀名
path = '1024.png' extension = 'jpg' for i in range(1,len(path)): if (path[-i] == '.'):#找到后缀初始点 new_p ...
- python查找相似图片或重复图片
1.查找重复图片 利用文件的MD5值可查找完全一样的重复图片 import os,time,hashlib def getmd5(file): if not os.path.isfile(file): ...
- 一篇文章带你了解轻量级Web服务器——Nginx简单入门
一篇文章带你了解轻量级Web服务器--Nginx简单入门 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 在本篇中我们会简单介绍Nginx的特点,安装,相关指令使用以及配置信 ...
- linux读写一个NTFS分区
为了读写一个NTFS分区的数据,挂载的时候出现错误提示如下: root@tv:/home/xx# mount -t ntfs-3g /dev/sdb1 /media/sxx/硬盘B-临时文件 The ...