Djanog admin 有用的设置
1、编辑界面设置
首先多ManyToMany多对多字段设置。可以用filter_horizontal或filter_vertical:
1. # Many to many 字段
2. filter_horizontal=('tags',)效果如下图:
这样对多对多字段操作更方便。
另外,可以用fields或exclude控制显示或者排除的字段,二选一即可。
例如,我想只显示标题、作者、分类标签、内容。不想显示是否推荐字段,可以如下两种设置方式:
fields = ('caption', 'author', 'tags', 'content')或者
exclude = ('recommend',) #排除该字段设置之后,你会发现这些字段都是一个字段占一行。若想两个字段放在同一行可以如下设置:
fields = (('caption', 'author'), 'tags', 'content')2、编辑字段集合
不过,我不怎么用fields和exclude。用得比较多的是fieldsets。该设置可以对字段分块,看起来比较整洁。如下设置:
fieldsets = (
("base info", {'fields': ['caption', 'author', 'tags']}),
("Content", {'fields':['content', 'recommend']})
)效果如下:
3、一对多关联
还有一种比较特殊的情况,父子表的情况。编辑父表之后,再打开子表编辑,而且子表只能一条一条编辑,比较麻烦。
这种情况,我们也是可以处理的,将其放在同一个编辑界面中。
例如,有两个模型,一个是订单主表(BillMain),记录主要信息;一个是订单明细(BillSub),记录购买商品的品种和数量等。
admin.py如下:
这样就可以快速方便处理数据。
4.设置只读字段
在使用admin的时候,ModelAdmin默认对于model的操作只有增加,修改和删除,但是总是有些字段是不希望用户来编辑的。而 readonly_fields 设置之后不管是admin还是其他用户都会变成只读,而我们通常只是想限制普通用户。 这时我们就可以通过重写 get_readonly_fields 方法来实现对特定用户的只读显示。
代码:
效果:
5、数据保存时进行一些额外的操作(通过重写ModelAdmin的save_model实现)
代码:
这样,在添加数据时,会自动保存申请人和备案号。
我们也可以在修改数据时获取保存前的数据:
通过change参数,可以判断是修改还是新增,同时做相应的操作。上述代码就是在替换磁盘的时候修改状态,并写入日志。
代码:
同样的,还有delete_model:
6. 修改模版 chang_form.html 让普通用户 无法看到 “历史” 按钮
默认 普通用户下 是存在 “历史” 按钮的:
此时 chang_form.html 的代码为:
to
7.对单条数据 显示样式的修改
每条数据都有 个确认标识(上图红框中),如果已经确认,用户再点击进入查看信息的时候全部只读显示,即不能在做修改,如果没确认在可以修改。如下:
已确认
未确认
实现方法:
change_view方法,允许您在渲染之前轻松自定义响应数据。(凡是对单条数据操作的定制,都可以通过这个方法配合实现)
8.修改app的显示名称
Django在Admin后台默认显示的应用的名称为创建app时的名称。
我们如何修改这个app的名称达到定制的要求呢,其实Django已经在文档里进行了说明。
从Django1.7以后不再使用app_label,修改app相关需要使用AppConfig。我们只需要在应用的__init__.py里面进行修改即可:
9.自定义列表字段
在DataPaperStore模型中有 end_date 字段,如果当前时间大于end_date 是我们想显示一个“已过期”,但 admin 列表显示不能直接用该字段,也显示不出来。此时可以通过自定义列表字段显示。如下设置admin:
通过自定义列表字段,获取相关数据再列表中显示,效果如下:
10.actions
代码如下:
为每个对象自定义 action
有时候你需要在单个对象上执行特定的 action。‘actions’工具当然可以完成这个任务,不过过程会显得很麻烦:点击对象、选择 action、再点击一个按钮……肯定有更便捷的方式,对吧?
让我们想办法只点击一次就全部搞定。
我们可以先自定义一个字段(上面提到过),让这个字段可以每次点击的时候帮我们做一些事情,比如:复制本条数据
自定义字段这个功能我们没问题,但是如何让它帮我们复制数据呢?
我们知道,django里所有的业务逻辑都是通过访问url从而指向对应的views来实现的,就是说我们想要实现复制数据,就必须有对应的url和views。
而admin为我们提供了对应的方法:get_urls
这个方法可以让我们临时添加一个url,并且可以防止手动输入此url实现操作。
代码:
11. formfield_for_foreignkey
formfield_for_foreignkeyModelAdmin.``formfield_for_foreignkey(db_field, request, **kwargs)¶
这个方法可以过滤下拉列表的数据,使之显示过滤后的数据
下面的代码表示,car字段会根据当前登录的用户显示此用户所拥有的车
12.Admin中使用二级联动
默认的django会自动根据我们定义的模型生成form给admin使用,使用到这个form的地方分别是change和add的时候。 最终生成的结果就是可以选择所有的省,也可以选择所有的市,这并不合理,正确的应该是在选择某个省的时候在市的下拉列表里只有该省的城市。 而,django原生并不能做到这么智能。下面介绍一下实现方法:
(1) admin.py
使用change_form_template 重置 change_form所使用得模版
(2)在上一步配置的路径下新建html文件 record_change_form.html
注意:1.继承change_form.html 2.设计好url
(3)在urls.py中添加一条对应的url
返回值就是过滤后的值。
参考:https://www.cnblogs.com/wumingxiaoyao/p/6928297.html
Last updated