在django admin详情表单显示中添加自定义控件的实现


Posted in Python onMarch 11, 2020

在开发中有需求在详情显示里外键字段内容,并且添加按钮弹窗内容,以及按钮跳转内容。

以前并没有做过相似的开发,我们的后台是xadmin,当时正在研究xadmin的插件,于是想着能不能用插件去做,后来发现太麻烦,而且实现起来我也没研究通,主要是添加按钮之类的没搞懂,于是就换了一种简单的方法。

首先先讲解下思路,admin中有几个界面,一个是展示的list界面,一个是详情的model界面,model中其实就是详情detail,里面记录了此条数据的全部内容,精简来说就是一个form表单的内容展示。

那么知道了这个就好解决了,我们只需要在form.py里添加对应的字段即可。

form自带了widget控件,比如我想在里面添加一个按钮,记录用户的积分消耗情况,那么就可以在类名下直接添加:

from django.forms import widgets
class AForm(forms.ModelForm):
 point = forms.CharField(
    label=u"积分消耗情况",
    widget=widgets.TextInput(attrs={'class': '[你需要的css样式]', 'value': '积分使用查询',
                 'style': 'width:100px','type':'button'}),
  )

解释下代码,首先导入widgets类,在form中添加一个字段,字段中有一个widget参数,我们可以在其中设置控件,我在里面添加了一个input类型,TextInput对象中的参数attrs传入的是一个字典,我们可以在里面像写html一样写相关的css样式。

这个时候我们就可以在详情内看见button了,但是相对应的,在detail的表单中添加后,在add的表单中也会出现一个button,这个不是我们想要的,所以就要想办法让button只存在于detail界面中,这时我们需要重写__init__方法:

def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
         initial=None, error_class=ErrorList, label_suffix=None,
         empty_permitted=False, instance=None, use_required_attribute=None):
     if instance:
       pk = instance.pk
       if not initial:
         initial = {}
         // initial['point'] = [value]
         self.base_fields['point'].widget.input_type = 'button'
     else:
       self.base_fields['point'].widget.input_type = 'hidden'
     super(CustomerUserForm, self).__init__(data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, instance, use_required_attribute)

用super调用了__init__方法,instance就是创建后该条数据的实例,我们可以在其中判断,如果instace存在的话,那么获取其中的id可以进行其他的操作,假如我们的point不是一个button,而是一个text格式的input,那么我们就可以在[value]处添加我们想要获取的值,并在attrs中将type改为hidden,可以看到我调用了一个self.base_fields[‘point']这个对象就是我们创建的button按钮。

self.base_fields是一个字典,里面添加了我们自定义的字段(我记得是的,如果有误可自行查看),通过字段name查询出该字段对象,掉用方法即可进行css样式的修改。

当instance不存在时,也就意味着对象还没有创建,我们此时正处于add界面,那么就可以用self.base_fileds字典将widget对象取出,把type设置为hidden。

至此,我们的form添加额外字段显示以及button操作就完成了,还有最后一点,当type为text时我们直接添加value即可,type为button时,如果需要点击弹窗该如何操作。

我们可以重写widgets.TextInput方法

class PointInput(widgets.TextInput):
  class Media:
    js = (
      'admin/js/customform.js',
    )
    css = {'all':'[csspath]'}

在media内部类中的js和css对象添加相应的静态文件即可。

而弹出窗口的值获取可以在form中添加一个hidden字段,value为我们想要获取的值,在js中取值赋值即可。

补充知识:Django admin 列表每行后面添加审核按钮

我就废话不多说了,还是直接看代码吧!

def pass_audit_str(self):
    parameter_str = 'id={}&status={}'.format(str(self.id), str(self.audit))
    color_code = ''
    btn_str = '<a class="btn btn-xs btn-danger" href="{}" rel="external nofollow" >' \
         '<input name="通过审核"' \
         'type="button" id="passButton" ' \
         'title="passButton" value="通过审核">' \
         '</a>'
    return format_html(btn_str, '/pass_audit/?{}'.format(parameter_str))

pass_audit_str.short_description = '通过审核'

在model类添加上面的方法和语句。

在admin类中的把 pass_audit_str 加入到list_display元组中

list_display = ('id', 'create_time', 'pass_audit_str',)

刷新页面即可;

以上这篇在django admin详情表单显示中添加自定义控件的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
跟老齐学Python之模块的加载
Oct 24 Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
Python使用turtle库绘制小猪佩奇(实例代码)
Jan 16 Python
Python单元测试及unittest框架用法实例解析
Jul 09 Python
python操作微信自动发消息的实现(微信聊天机器人)
Jul 14 Python
10个示例带你掌握python中的元组
Nov 23 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 Python
python图像处理 PIL Image操作实例
Apr 09 Python
django admin 添加自定义链接方式
Mar 11 #Python
django xadmin 管理器常用显示设置方式
Mar 11 #Python
django从后台返回html代码的实例
Mar 11 #Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
Mar 11 #Python
python3 实现口罩抽签的功能
Mar 11 #Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 11 #Python
Django+boostrap 美化admin后台的操作
Mar 11 #Python
You might like
基于mysql的bbs设计(二)
2006/10/09 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
python中实现指定时间调用函数示例代码
2017/09/08 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
python中的协程深入理解
2019/06/10 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
会计毕业生自荐信
2013/11/21 职场文书
小学语文业务学习材料
2014/06/02 职场文书
世界读书日的活动方案
2014/08/20 职场文书
质量主管工作职责
2014/09/26 职场文书
长江三峡导游词
2015/01/31 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
销售员岗位职责范本
2015/04/11 职场文书
高一军训口号
2015/12/25 职场文书
Python实现位图分割的效果
2021/11/20 Python
Java 在线考试云平台的实现
2021/11/23 Java/Android