Django - Xadmin (五) POP

功能及逻辑描述

pop 功能:在添加数据时,对于需要选择的多对多字段,在其 input 框边加上一个按钮,点击该按钮可以实现跳转到添加该字段数据的页面;添加该字段数据后,添加字段数据页面消失,返回到原来添加页面;此时新添加的内容已经出现在选项中并默认选中。

页面跳转与消失的逻辑

跳转逻辑:

window.open(url, "", "width:400,height=200,top=100,left=100")

window.open 函数指定跳转的 url ,出现的位置和新窗口的大小。

页面自动消失的逻辑:

在前面跳转到的页面中的 script 中加上 window.close(); 可以实现页面自动关闭,而如果想在页面关闭之前要实现一些业务逻辑可以将代码写在该代码之前。如果要实现的业务逻辑需要用到跳转到该页面之前的母页面,可以使用 window.opener.母页面中的函数 的方式。

后台处理

主要是在 add_view 视图函数中进行处理。

添加数据主要是通过 ModelForm 组件实现的,先对构造该类时进行更改。

# 实现pop功能
for bfield in form:
# 字段对象
# print(bfield.field)
# print(type(bfield.field)) # 字段类型
# print("name", bfield.name) # 字段名 if isinstance(bfield.field, ModelChoiceField):
# 如果是一对多或多对多字段,需要pop功能
bfield.is_pop = True # print(bfield.name, "=====>", bfield.field.queryset.model) # bfield.field.queryset.model是所关联的模型表
related_model_name = bfield.field.queryset.model._meta.model_name
related_app_label = bfield.field.queryset.model._meta.app_label _url = reverse("%s_%s_add"%(related_app_label, related_model_name))
bfield.url = _url+"?pop_res_id=id_%s"%bfield.name

对在 ModelForm 类中的每个字段进行判断,如果是一对多或者多对多字段则认定需要 pop 功能。获取字段关联的模型表,并通过 reverse 函数得到该字段 pop 时需要的 url ,添加到该字段的 url 属性当中。

 # 从前端传回数据
if request.method == "POST":
form = ModelFormDemo(request.POST)
# 通过校验,保存并返回到查看页面
if form.is_valid():
obj = form.save() pop_res_id = request.GET.get("pop_res_id") # 按pop方式打开,返回到之前添加页面
if pop_res_id:
res = {"pk":obj.pk, "text": str(obj), "pop_res_id":pop_res_id}
return render(request, "pop.html", {"res": res}) # 如果不是经过pop打开,按正常方式返回
else:
return redirect(self.get_list_url())

对于从前端传回来的数据进行添加到数据库中的操作,现在多了一步,就是判断是否按 pop 方式打开,是则返回之前添加页面,并传回新添加数据的信息。

前端处理

form.html

{% for field in form %}
<div style="position: relative">
<label for="">{{ field.label }}</label>
{{ field }}
<span class="error pull-right">{{ field.errors.0 }}</span>
{% if field.is_pop %}
<a onclick="pop('{{ field.url }}')" style="position: absolute;right: -30px;top: 20px;"><span style="font-size: 28px;">+</span></a>
{% endif %} </div>
{% endfor %} <script>
function pop(url) {
// alert(url);
window.open(url, "", "width:400,height=200,top=100,left=100")
}
</script>

在循环 ModelForm 表单的时候判断是否为需要 pop 功能的字段,如果是,增加 pop 链接。然后为 pop 功能绑定跳转页面函数。

pop.html

<script>
// 调用该窗口的窗口执行该函数
window.opener.pop_response('{{ res.pk }}', '{{ res.text }}', '{{ res.pop_res_id }}');
window.close();
</script>

作为中转的临时页面,pop.html 就是负责调用母页面的函数并自动消失。

add_view.html

<script>
function pop_response(pk, text, id) {
console.log(pk);
console.log(text);
console.log(id); // 选择相应的select标签
// option文本值和value值 var $option = $('<option>');// 创建标签
$option.html(text); // 加文本
$option.val(pk); // 加value
$option.attr("selected", "selected"); // 加属性
$("#"+id).append($option); // 将option标签加上去
}
</script>

add_view.html 中的逻辑就是将获取到的,新添加数据的信息增加到 option 标签中并默认选中。

完整代码地址:pop 功能

Django - Xadmin (五) POP的更多相关文章

  1. 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框

    第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...

  2. 第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html

    第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入dja ...

  3. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...

  4. Django+xadmin打造在线教育平台(二)

    三.xadmin后台管理 3.1.xadmin的安装 django2.0的安装(源码安装方式): https://github.com/sshwsfc/xadmin/tree/django2 把zip ...

  5. Django+xadmin打造在线教育平台(三)

    五.完成注册.找回密码和激活验证码功能 5.1.用户注册 register.html拷贝到templates目录 (1)users/views.py class RegisterView(View): ...

  6. Django+xadmin打造在线教育平台(一)

    目录 在线教育平台(一)      在线教育平台(二) 在线教育平台(三)      在线教育平台(四) 在线教育平台(五)      在线教育平台(六) 在线教育平台(七)      在线教育平台( ...

  7. 第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件

    第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件 设置后台列表页面字段统计 在当前APP里的adminx.py文件里的数据表管理器里设置 ag ...

  8. django+xadmin在线教育平台(十)

    剩余app model注册 courses注册 新建courses/adminx.py: # encoding: utf-8 __author__ = 'mtianyan' __date__ = '2 ...

  9. 第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置

    第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置 软件版本  uwsgi- ...

随机推荐

  1. linux运维、架构之路-MySQL备份与恢复(四)

    一.备份方式 ①逻辑备份(文件表示:SQL语句) ②物理备份(数据文件的二进制副本) ③基于快照的备份 ④基于复制的备份 二.备份工具 ①mysqldump:原生自带的逻辑备份工具 ②mysqlbin ...

  2. React Native 之createDrawerNavigator和createSwitchNavigator

    其他代码接上篇文章 createDrawerNavigator 抽屉 createSwitchNavigator 模拟登录=>主界面 index.js /** * @format */ impo ...

  3. 大文件上传-大视频上传,T级别的,求解决方案

    第一点:Java代码实现文件上传 FormFile file = manform.getFile(); String newfileName = null; String newpathname =  ...

  4. codeforces 682C

    鸽了两天,还是我太蒟了,mayan游戏调不出来,难题又不会,只有刷水DFS才能勉强维持一下生计这样子,我还是要提高姿势水平啊! 题目描述: 给定一棵树,每条边有边权,每个点有点权,如果某个点到其子节点 ...

  5. [CSP-S模拟测试]:老司机的狂欢(LIS+LCA)

    题目背景 光阴荏苒.不过,两个人还在,两支车队还在,熟悉的道路.熟悉的风景,也都还在.只是,这一次,没有了你死我活的博弈,似乎和谐了许多.然而在机房是不允许游戏的,所以班长$XZY$对游戏界面进行了降 ...

  6. bootstrap插件bootstrap-select使用demo

    插件bootstrap-select官网 : https://developer.snapappointments.com/bootstrap-select/ bootstrap-select插件: ...

  7. pl/sql的安装使用详解

    一.  先安装  orcale10.1客户端 setup右键属性,按下图设置 net  manager 设置,不设置 pl/sql developer没办法连接 二.再安装 pl/sql develo ...

  8. React Native商城项目实战16 - 购物中心详细页

    逻辑分析: 首页(Home)加载的购物中心组件(ShopCenter),传递url数据: ShopCenter里根据url加载购物中心详细页组件(ShopCenterDetail), ShopCent ...

  9. qbzt day6 下午 模拟赛

    我太菜了 T2 给定一张有向图,每个点有点权.试找到一条路径,使得该路径上的点权最 大值减去点权最小值最大,问这个差最大是多少.   话说这个题第一个想到的思路是tarjan缩点+拓扑排序来着... ...

  10. Eclipse设置控制台日志输出位置

    1.选择服务器配置 2.设置输出文件路径