在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

标签:django,admin,表单,控件
0
投稿

猜你喜欢

  • Python文件的应用之序列化与反序列化详解

    2021-06-19 22:20:45
  • Sql Server里删除数据表中重复记录的例子

    2024-01-19 18:37:31
  • Python利用Xpath选择器爬取京东网商品信息

    2021-05-18 09:08:41
  • itchat接口使用示例

    2022-09-01 05:16:36
  • python统计字母、空格、数字等字符个数的实例

    2022-10-04 12:02:29
  • Django数据库迁移常见使用方法

    2024-01-17 09:57:26
  • Python requests用法和django后台处理详解

    2023-06-12 02:05:42
  • python套接字流重定向实例汇总

    2022-04-15 07:53:41
  • Design IT. (3),看不懂数据

    2009-02-11 10:56:00
  • 公网远程访问局域网SQL Server数据库

    2024-01-22 01:38:21
  • mysql5在rhel5下乱码问题及解决方法

    2010-12-03 16:26:00
  • PyQt4编程之让状态栏显示信息的方法

    2021-07-22 04:11:19
  • 跨浏览器的inline-block[译]

    2009-03-11 21:04:00
  • 用Python做的数学四则运算_算术口算练习程序(后添加减乘除)

    2023-04-10 13:27:35
  • C#应用XML作为数据库的快速开发框架实现方法

    2024-01-19 12:00:01
  • scrapy-redis源码分析之发送POST请求详解

    2021-05-19 05:24:03
  • oracle 服务启动,关闭脚本(windows系统下)

    2024-01-21 08:49:18
  • Python人工智能之波士顿房价数据分析

    2021-09-23 19:43:35
  • Oracle字段根据逗号分割查询数据的方法

    2024-01-14 01:34:19
  • Python绘图示例程序中的几个语法糖果你知道吗

    2021-01-18 17:15:25
  • asp之家 网络编程 m.aspxhome.com