Django admin列表页给每一行自定义按钮

697 阅读1分钟

可以通过自定义Django Admin的list_display选项和自定义的JavaScript脚本来实现。

  1. 首先,您需要自定义Django admin模型的list_display。在您所需的列中添加一个自定义的HTML字段,指向一个按钮,例如:
from django.urls import reverse
from django.utils.html import format_html

class YourAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'custom_button')
    def custom_button(self, obj):
        url = reverse('admin:custom_view', args=[obj.id])
        return format_html('<a class="button" href="{}">Custom Button</a>', url)    
        
    custom_button.short_description = 'Actions'
  1. 创建一个新的视图来处理这个按钮的点击事件,并返回表格的HTML。(在urls.py中添加视图的URL)
from django.shortcuts import render

def custom_view(request, object_id):    
    # 处理数据    
    return render(request, 'custom.html', {'data': data})
  1. 创建一个HTML页面,其中包含您想要显示的表格。将其存储在/admin/templates/中,或者使用 os.path.join(settings.BASE_DIR, 'templates')指定模板路径。
<!doctype html>
<html>
<head>    
    <meta charset="UTF-8">    
    <title>Custom View</title>
</head>
<body>    
    <table>
    {% for row in data %}        
        <tr>
        {% for cell in row %}
            <td>{{ cell }}</td>        
        {% endfor %}        
        </tr>    
    {% endfor %}    
    </table>
</body>
</html>
  1. 最后一步是在自定义JavaScript脚本中定义按钮的单击事件。您可以在 Django Admin 管理界面的base_site.html中引入此脚本。以下是一个示例脚本:
(function($) {
    $(document).ready(function() {
         $('.button').click(function(event) {
             event.preventDefault();
             $.ajax({
                 url: $(this).attr('href'),
                 success: function(data) {
                     $('body').append(data);
                 }
             });
         });
     });
 })(django.jQuery);

当每一行的按钮被点击时,上述脚本将发起一个 AJAX 请求,以获取定义的表格 HTML 页面,然后将其追加到文档的末尾。 本方法可以通过自定义JavaScript视图来显示HTML,JSON,CSV或任何其他可渲染的数据类型。