前言

有时候我们希望在不离开主页或者索引页的情况下显示所有需要的用户信息,换句话说,就是让form表单显示在一个新层layer上,在一个弹出的模态窗口modal window里。

要在一个模态窗口渲染表单非常容易,只需要使用ajax请求并且将返回结果显示在你的模态窗口上即可。但是有的时候如果我们想继续操作这个表单就比较棘手了,尤其是出错的时候。通常情况下,django会重定向用户到一个显示出错的表单,但是如果表单本身并没有自己的页(自己的完整模板),只是存在于一个模态窗口中,我们怎么来处理这种情况呢?

这儿,我们将介绍一种方法来解决这个问题,它会用到django, bootstrap和modal,jquery和jquery form plugin

场景

我们有一些列表条目带有编辑按钮,当点击这些编辑按钮时,表单将会渲染到一个模态窗口中,让你在这个窗口中完成内容更新。

视图

我们使用django类的ListView和UpdateView,第一个用来管理条目列表,第二个用于条目更新。

from django.views.generic import UpdateView, ListView

from django.http import HttpResponse

from django.template.loader import render_to_string

from myapp.models import Item

from myapp.forms import ItemForm

"""

items list

"""

class ItemListView(ListView):

model = Item

template_name = 'myapp/item_list.html'

def get_queryset(self):

return Item.objects.all()

"""

Edit item

"""

class ItemUpdateView(UpdateView):

model = Item

form_class = ItemForm

template_name = 'myapp/item_edit_form.html'

def dispatch(self, *args, **kwargs):

self.item_id = kwargs['pk']

return super(ItemUpdateView, self).dispatch(*args, **kwargs)

def form_valid(self, form):

form.save()

item = Item.objects.get(id=self.item_id)

return HttpResponse(render_to_string('myapp/item_edit_form_success.html', {'item': item}))

ItemListView类很简单,不做特别解释。

在ItemUpdateView 类里,我重写了dispatch 方法,它会从url里读取item id,这样我就能在form_valid函数里将这个item对象传递给模板item_edit_form_success template。模板item_edit_form仅仅包含modal的内容,没有其他内容。

在urls.py里,你必须调用ItemUpdateView并在url里获取 pk参数,它是即将编辑条目的id。

ItemForm也没什么特别的,就不在这儿贴出它的内容了。

模板

接下来开始处理列表模板item_list.html。

{% extends 'base_site.html' %}

{% block extra_js%}

{% endblock %}

{% block content %}

Items list

Item Actions

{% for loan in object_list %}

{{ item.name }}

|

{% endfor %}

{% endblock %}

有三件事情需要注意一下:

在页面包含js plugin: jquery.form.js

添加modal container 的markup标记 (参考bootstrap modals)

使用链接去加载href属性里url的响应内容,加载的内容显示在modal内(ajax请求)。

学习bootstrap modals来理解这三点,重点关注的是:

如果remote url已经提供,内容会通过jquery load方法一次获取并注入到.modal-content div中。如果使用的是data-api,你需要使用href属性去指定远端数据源。

上面这些响应内容从哪儿来的?这里会用到模板item_edit_form.html。

×

Item {{ item.id }}

{% csrf_token %}

{{ form.non_field_errors }}

{% for field in form %}

{% if field.errors %}

{% for error in field.errors %}

{{ error|escape }}

{% endfor %}

{% endif %}

{{ field.label_tag }} {{ field }}

{% if field.help_text %}

{{ field.help_text }}

{% endif %}

{% endfor %}

jQuery('.modal-content .calendar').datepicker({ dateFormat: "yy-mm-dd" });

var form_options = {

target: '#modal',

success: function() { }

}

$('#item_update_form').ajaxForm(form_options);

其他要考虑的一些点:

我们给form定义了一个id属性。

并显式了定义了form的action。为什么?因为form会在列表页内加载,一个空的action属性表示action就是当前页(list url),这显然不符合我们的期望。

我们通过ajax方式来提交表单。

第三点尤其重要,用django实现modal form遇到的最要的最大的问题之一是,如果遇到任何错误,它应该返回在form页内,但是如果form没有自己的页,我们该怎么做呢?

你可能想到的方法是将结果返回到列表页内,传递一些GET参数,读这些参数并且重新打开modal,但是这样的话form error变量会丢失。所以,你需要在list view实现form action,并且传递form处理结果到ajax url,由它渲染form。

一个简单且优美的解决方案是通过ajax提交form并且捕捉响应。如果响应是相同的form并且包含错误的话,我们更新对应的modal内容,如果返回成功,我只需要关闭modal,非常简单!

如果你还记得的话,modal container的id属性是#modal,并且它也是form_option js对象的目标属性,对modal的操作是通过这个id来完成的。

到此,方案基本已完成,如果发生错误,form在modal内显示错误,不需要重新加载页面。

我们还有最后一件事要做:实现表单提交没有错误时的模板,该表单渲染返回结果response,名字item_edit_form_success.html,如下:

×

Pratica {{ loan.id }}

Fuck yeah!

setTimeout(function() { jQuery('#modal').modal('hide'); }, 1000);

$('body').on('hidden.bs.modal', '.modal', function () {

$(this).removeData('bs.modal');

});

我们首先显示一些成功信息,一秒之后销毁这个modal。请注意,这儿是销毁不是隐藏,因为如果我们只是隐藏的话,将来点击编辑按钮,相同的内容会在modal里显示(bootstrap工作原理)。因为这个原因,我们的做法是销毁这个modal,下次调用时重新创建。

总结

在django内用bootstrap modal和 jquery form plugin来实现modal form是可行的。目标是通过ajax提交form,然后在相同的modal内加载ajax响应。如果出错了,form会被重写并且包含错误消息,否则提供一个成功返回会并通过js 代码在一秒内销毁这个modal。

参考资料

关注下方公众号获取更多文章

django弹出对话框_Django模式弹出对话框实现相关推荐

  1. 实现php a标签文件,HTML_如何点击a标签实现弹出input file上传文件对话框,html 复制代码代码如下: SPAN - phpStudy...

    如何点击a标签实现弹出input file上传文件对话框 html 复制代码代码如下: <div> <a href="###">添加图片a> < ...

  2. js在IE下面弹出打开和保存文件的对话框

    js在IE下面弹出打开和保存文件的对话框 2010-08-11 13:39:16|  分类: JavaScript |  标签: |字号大中小 订阅 <html> <head> ...

  3. 对话框的动画弹出和动画消隐

    最近看到一篇文章<谈对话框的动画弹出和动画消隐>,文章提到了利用定时器实现对话框动画的效果,比葫芦化瓢,却发现不但没有动画,而且连窗口也没有了,经过简单的修改,终于实现了文中的效果,发现是 ...

  4. TortoiseGit 弹出 git@xxx.com‘s password 对话框

    安装完 tortoise git,用它克隆项目的时候,一直弹出git@xxx.com's password 对话框, 而且不管输不输入密码都提示错误 解决的办法是,将ssh客户端默认的路径,换为git ...

  5. bootstrap的弹窗剧中_jquery – 如何让BootPrap(Plugin)的ClockPicker出现在Bootstrap Modal弹出窗体中?...

    以下是ClockPicker for Bootstrap: http://www.jqueryrain.com/?B83aD_dg的链接 它完美地运作;但是,当我尝试使用它来填充Bootstrap模式 ...

  6. bootstrap获取弹框数据_Bootstrap模态弹出框的实例教程

    前面的话 在 Bootstrap 框架中把模态弹出框统一称为 Modal.这种弹出框效果在大多数 Web 网站的交互中都可见.比如点击一个按钮弹出一个框,弹出的框可能是一段文件描述,也可能带有按钮操作 ...

  7. android一天一次弹窗,Android自定义Toast,多次弹出时取消上次弹出,最后一次弹出为准...

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. Android的Toast用队列管理弹出的消息,这个自定义的Toast用于频繁弹出Toas ...

  8. 弹出并点击弹框关闭 自定义toast_关于别名配置使用弹框交互应用的思考

    温馨提示 如果你喜欢本文,请帮助我将这篇文章分享到朋友圈,喜欢我的文章,可以关注我,我们一起交流. 本文:2052字 | 估计阅读:6分钟 我在思考功能实现需求的时候,会斟酌和判断使用什么样的功能和交 ...

  9. 关于password导致input弹出浏览器记住密码弹框问题

    关于password导致input弹出浏览器记住密码弹框问题 问题描述 问题解决 代码实现 问题描述 当有input有password的输入框在的时候,其他input输入框可能会在获取光标的时候会弹出 ...

最新文章

  1. Z-STACK的一些小内容
  2. windows2008的功能介紹及其与2003的差异
  3. adb 命令小集(转)
  4. abap性能优化——利用凭证的number ranger提高abap程序性能
  5. 使用PyCharm定义QQ变量
  6. ios 百度地图指定区域_ios百度地图的使用(普通定位、反地理编码)
  7. 编程:休息片刻的好处
  8. GMF 教程 Mindmap 5
  9. 【2016年第6期】21世纪天文学面临的大数据和研究范式转型
  10. 2.啊哈!算法 --- 一大波数正在靠近——栈、队列、链表
  11. Java基础---Java中运算符优先级(十六)
  12. 【安全研究】免杀对抗之源码免杀
  13. 中考计算机上机考试如何操作,全国2021年初中信息技术中招考试上机考试提分技巧...
  14. 判断一个点是否在矩形内PtInRegion-解决PtInRect不能正确判断不同形式TRent的情况
  15. 微信小程序-从相册获取图片,视频 使用相机拍照,录像上传+服务器(nodejs版)接收
  16. QT 设置label内字体,字体颜色,背景色 ; 字体的中英对照
  17. 数据分析-思维分析逻辑day05
  18. 《大侦探福尔摩斯2:诡影游戏》蓝光高清720P 1080P下载[2011最新动作]
  19. 微信小程序开发实现微信支付
  20. javaEE的13个规范

热门文章

  1. UML建模综合练习--网上书店
  2. web端使用腾讯地图
  3. 中秋qq表情包 2004 瑞星杀毒软件2007
  4. 教训总结(持续更新中)
  5. 计算机主板维修的意义,主板维修个人经验 -电脑资料
  6. 计算机应用系统设计---8路抢答器
  7. matlab矩阵错位相加,矩阵的旋转和相加——数组实现
  8. SpringCloud 从入门到入土
  9. 三款主流文件校验码工具HashCalc、WinMD5、Hasher
  10. win10系统怎么设置自动登录?