一个奇技淫巧
在django admin的 change list界面里,自定义一个action, 当执行这个action之后,一般来说页面会刷新,所有选中状态会消失,
查了半天也没发现有太简单的方法,什么重写一个template等等,就为了一个选中状态,懒得搞。
于是在action中用mark_safe标签把一个带值的hidden渲染到页面,admin class 里增加两个js媒体文件,根据id值自动点击之。
class ReceiptAdmin(admin.ModelAdmin):
...
def sum(self, request, queryset):
sum_ids = []
for q in queryset:
sum_ids.append(q.id)
receipt_sum = queryset.aggregate(Sum('amount'))
self.message_user(request, mark_safe(f'选中的发票金额合计: {receipt_sum["amount__sum"]} <input id="selected_ids" type="hidden" value="{sum_ids}" />'),
level=messages.SUCCESS, fail_silently=False)
sum.short_description = 'Sum'
class Media:
js = ('admin/js/jquery.init.js', 'custom/js/highlight_selected_rows.js', )
js文件代码如下:
(function ($) {
$(document).ready(function () {
let $selectedIds = $('#selected_ids');
if ( $selectedIds.length ) {
let ids = $selectedIds.val();
let idJson = JSON.parse(ids);
$('.action-select').each(function () {
let $checkbox = $(this);
for (let id of idJson) {
if ($checkbox.val() === id.toString()) {
$checkbox.click();
}
}
});
}
});
})(django.jQuery);
实际效果大约是这鬼样子(执行自定义操作后):
记录下,这种奇技淫巧时间长了自己一般会忘记了当初是怎么实现的。。。
-----------------------------------------------------
弄成一个pip 安装包了
pip install django-highlightselect-model-admin
代码地址: https://github.com/laonan/django-highlightselect-model-admin