Background
自定义按钮,默认点击时需要选择至少一个选项,但是我定义的这两个按钮不需要选择,就是对全部记录进行操作的,所以我们需要重写simpleui的
actions.html
。我这里还是比较懒的处理方法——直接在源码修改哈。
1、默认情况就像这样
2、找到simpleui的 actions.html
这个是我的路径
D:\software\python3.7.8\Lib\site-packages\simpleui\templates\admin\actions.html
3、修改内容
这里其实只加了一个判断,以
fc_
开头的按钮就可以直接点击了。所以,我们自定义的按钮需要以fc_
开头。代码给你准备好了,直接复制粘贴过去替换原来那一段就行了。
//TODO 需要做国际化
if (data_name.substr(0, 3) == "fc_"){
// 强制运行, 不用选择数据. 按钮名data_name必须以"fc_"开头.
done.call(this);
} else if (checkbox_checked == 0 && data_name != "add_item" && !_action.customButton[data_name].action_url) {
_vue.$alert(getLanuage("Please select at least one option!"), '', {
type: 'warning'
})
} else if (confirm) {
_vue.$confirm(confirm, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => done.call(this));
} else {
done.call(this)
}
4、最后重写 changelist_view
方法就行了
这里我把这部分代码都放上来了。
@admin.register(models.FakeVal)
class FakeValAdmin(admin.ModelAdmin):
"""模拟环境信息"""
list_display = ('type_id', 'type_code', 'type_name', 'is_enable', 'min_val', 'max_val', 'interval', 'decimal',
'remarks')
list_editable = ('is_enable', 'min_val', 'max_val', 'interval', 'decimal', 'remarks')
fields = ('type_id', 'type_code', 'type_name', 'is_enable', 'min_val', 'max_val', 'interval', 'decimal', 'remarks',
'update_user_id', 'update_time')
readonly_fields = ['type_id', 'type_code', 'type_name', 'update_user_id', 'update_time']
ordering = ('type_id',)
list_filter = ('type_id', 'type_code', 'type_name', 'is_enable')
list_per_page = 20
# 增加自定义按钮
actions = ['back_button', 'fc_enable_button', 'fc_disable_button']
def back_button(self, request, queryset):
pass
def fc_enable_button(self, request, queryset):
models.FakeVal.objects.update(is_enable=1)
def fc_disable_button(self, request, queryset):
models.FakeVal.objects.update(is_enable=0)
def changelist_view(self, request, extra_context=None):
if 'action' in request.POST and request.POST['action'].startswith('fc_'):
if not request.POST.getlist(ACTION_CHECKBOX_NAME):
post = request.POST.copy()
for u in models.FakeVal.objects.all():
post.update({ACTION_CHECKBOX_NAME: str(u.id)})
request.POST = post
return super(FakeValAdmin, self).changelist_view(request, extra_context)
# 按钮名称
back_button.short_description = ' 返回数据模拟'
fc_enable_button.short_description = ' 全部启用'
fc_disable_button.short_description = ' 全部停用'
# 按钮图标
back_button.icon = 'fas fa-backward'
fc_enable_button.icon = 'fas fa-lock-open'
fc_disable_button.icon = 'fas fa-lock'
# 按钮颜色
back_button.type = 'info'
fc_enable_button.type = 'success'
fc_disable_button.type = 'danger'
back_button.action_type = 0
back_button.action_url = '/chart/fake/'
def has_delete_permission(self, request, obj=None):
return False
def has_add_permission(self, request):
return False
def has_change_permission(self, request, obj=None):
return True
5、鸣谢
感谢【weixin_40960372】这位大神的指导,大家可以参考他的开源项目 bddjango,我就是根据他这个修改成功的。