时间:2021-05-22
在开发中有需求在详情显示里外键字段内容,并且添加按钮弹窗内容,以及按钮跳转内容。
以前并没有做过相似的开发,我们的后台是xadmin,当时正在研究xadmin的插件,于是想着能不能用插件去做,后来发现太麻烦,而且实现起来我也没研究通,主要是添加按钮之类的没搞懂,于是就换了一种简单的方法。
首先先讲解下思路,admin中有几个界面,一个是展示的list界面,一个是详情的model界面,model中其实就是详情detail,里面记录了此条数据的全部内容,精简来说就是一个form表单的内容展示。
那么知道了这个就好解决了,我们只需要在form.py里添加对应的字段即可。
form自带了widget控件,比如我想在里面添加一个按钮,记录用户的积分消耗情况,那么就可以在类名下直接添加:
from django.forms import widgetsclass 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详情表单显示中添加自定义控件的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在Android开发中,往往要用到自定义的控件来实现我们的需求或效果。在使用自定义控件时,难免要用到自定义属性,那怎么使用自定义属性呢?在文件res/value
有时需要一些控件加上自定义的属性,下面就介绍自定义控件的简单实现1、新建一个vb的窗口程序2、在新建的项目上右键->添加->新建项3、向下拖动,找到自定义控件,
在Django框架中,自带一个后台管理页面admin,这个管理页面很全,但是,有些并不是我们需要的,所以我们可以根据admin的实现流程来自定义自己的需求,即根
Android自定义控件实现显示文字的功能自定义控件—–逐个显示文字ONEGoal,ONEPassion!前言:今天要实现的效果时.让我们的文字一个一个显示出来
自定义Marker,可以理解为在地图上自定义图标(CustomMarker),先看看GMap的地图和图标的显示方式:Map控件上可以添加Overlay(图层),