一个奇技淫巧

在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

For example, "name@something.com". If someone replies to you it will be via email.
For example, "http://someaddress.com"