在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爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
Python中使用摄像头实现简单的延时摄影技术
Mar 27 Python
利用Pandas 创建空的DataFrame方法
Apr 08 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
Tensorflow分类器项目自定义数据读入的实现
Feb 05 Python
python爬取微信公众号文章的方法
Feb 26 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
Jul 28 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 Python
Python经常使用的一些内置函数
Apr 11 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
十天学会php(3)
2006/10/09 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
php框架知识点的整理和补充
2021/03/01 PHP
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
JS使用Date对象实时显示当前系统时间简单示例
2018/08/23 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
利用Python如何生成便签图片详解
2018/07/09 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
python构造函数init实例方法解析
2020/01/19 Python
html5 标签
2009/07/16 HTML / CSS
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
水务局局长岗位职责
2013/11/28 职场文书
制衣厂各岗位职责
2013/12/02 职场文书
酒店人事专员岗位职责
2013/12/19 职场文书
运动会领导邀请函
2014/02/05 职场文书
酒鬼酒广告词
2014/03/21 职场文书
HR求职自荐信范文
2014/06/21 职场文书
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL