在django admin详情表单显示中添加自定义控件的实现
作者:p546746447 发布时间:2023-09-24 18:56:00
在开发中有需求在详情显示里外键字段内容,并且添加按钮弹窗内容,以及按钮跳转内容。
以前并没有做过相似的开发,我们的后台是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',)
刷新页面即可;
来源:https://blog.csdn.net/p546746447/article/details/86496378


猜你喜欢
- 概述数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能导致脏读、脏写、不可重复度和幻读。这些问题的本
- 单分支结构:if 语句Python 中 if 语句的语法格式如下:if <条件>:    
- 本文实例讲述了python实现数独算法的方法。分享给大家供大家参考。具体如下:# -*- coding: utf-8 -*-'
- 本文实例讲述了Python实现的批量修改文件后缀名操作。分享给大家供大家参考,具体如下:windows和linux下都支持该程序
- python opencv把一张图片嵌入(叠加)到另一张图片上1、背景:最近做了个烟火生成系统的界面设计,需要将烟雾图片嵌入到任意一张图片中
- 也有些正则方法可以限制回归算法输出结果中系数的影响,其中最常用的两种正则方法是lasso回归和岭回归。lasso回归和岭回归算法跟常规线性回
- 所有人都知道select top 的用法,但很多人还不知道update top 和 delete top 怎么用。以往的做法是set row
- 自定义模板标签,过滤器。英文翻译是Customtemplatetagsandfilters。customfilter自定义过滤器今天不在我的
- 在windows下安装配置Ulipad今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。Ulipad下载地址
- 本文实例为大家分享了PHP文件打包下载zip的具体代码,供大家参考,具体内容如下<?php//获取文件列表function list_
- Line plotsAxes3D.plot(xs, ys, *args, **kwargs)绘制2D或3D数据参数描述xs, ysX轴,Y轴
- 现在大家常用的桌面操作系统有:Windows、Mac OS、ubuntu,其中Mac OS 和 ubuntu上都会自带python。这里我们
- 1.安装less依赖:npm install less less-loader --save 2.修改webpack.base.config
- 系统存储过程,sp_executesql 语言在这里! sp_executesql 执行可以多次重用或动
- 附上代码与运行结果截图:import time# 获取当前时间now = time.localtime()# 格式化日期now_ = tim
- 各种坑用py2exe,不支持,仅支持2.x用cx_frezee,各种问题方法 用pyinstaller。安装时务必用pip3 install
- 0. 前言本节中,我们使用策略梯度算法解决 CartPole 问题。虽然在这个简单问题中,使用随机搜索策略和爬山算法就足
- 我们知道,C++和python各有优缺点,C++可以直接映射到硬件底层,实现高效运行,而python能够方便地来进行编程,有助于工程的快速实
- 可以压缩文件和目录。package mainimport ( "archive/zip" &qu
- 前言用python编程绘图,其实非常简单。中学生、大学生、研究生都能通过这10篇教程从入门到精通!快速绘制几种简单的柱状图。1垂直柱图(普通