如何将 CSS 按钮添加到 Django 管理员以实际触发逻辑

Posted

技术标签:

【中文标题】如何将 CSS 按钮添加到 Django 管理员以实际触发逻辑【英文标题】:How to get CSS button added to Django admin to actually trigger logic 【发布时间】:2017-01-21 03:17:15 【问题描述】:

即使按钮本身显示在屏幕上,我添加到 Django 管理员的“导出”按钮也不会连接到我的视图。我已经使用了几个关于 SO 的教程来使按钮可见 - 但单击时它什么也不做,重新加载同一页面。我有一种感觉,我设置它的结构是错误的,或者我没有正确地将数据库中的数据传递给它。

我假设这里有我遗漏的错误? 如何将我的导出函数中已有的数据传递给我 数据库?我想我必须做一个查询集,但我不确定我是否 实际获取数据或将其放置在正确的位置。这 按钮旨在让用户导出所有已经 已存储(例如,特定类型的所有记录)到 Excel 文件中。

我的应用 > css > categories.css(创建按钮)

.btn
    border: solid 1px #000;
    background: #eee;
    border-radius: 3px;
    margin-top: 20px;
    float: right;
    text-align: right;
 

我对@9​​87654322@ 模板所做的更改以使我的按钮可见(我将其放在管理员更改列表的搜索栏之后):

% block search %% search_form cl % <form action="#" method="get">
 <input type="submit" class="btn" value="Export" name="export" align="right">% endblock %

views.py:

from django.template import RequestContext

def excel_view(request):
    attorney_range = Attorney.objects.all().filter(active=True)
    if request.GET.get('export'):
        if 'export' in request.GET:
            response = HttpResponse(content_type='application/vnd.ms-excel')
            response[
                'Content-Disposition'] = 'attachment; filename=Report.xlsx'
            xlsx_data = WriteToExcel(attorney_range)
            response.write(xlsx_data)
            return response
        else:
            return render("change_list.html",
                          context_instance=RequestContext(request),
                          template_name='change_list.html')

我的导出到 Excel 函数所在的名为 excel_utils.py 的文件:

from io import StringIO
import xlsxwriter
from django.utils.translation import ugettext
from .models import Attorney


def WriteToExcel(attorney_range):
    attorney_range = Attorney.objects.all().filter(active=True)
    output = StringIO.StringIO()
    workbook = xlsxwriter.Workbook(output)
    worksheet_s = workbook.add_worksheet("Summary")

    # excel styles here

    attorney_range = Attorney.objects.all()
    attorney_list = []
    for x in attorney_range:
        attorney_list.append(x)
    for idx, data in enumerate(attorney_list):
        row = 5 + idx
        worksheet_s.write_boolean(row, 1, cell_center)
        worksheet_s.write_string(row, 2, attorney_list.index(2))

【问题讨论】:

【参考方案1】:

连接按钮

您的自定义视图是如何被调用的并不明显。为呈现管理页面而调用的视图内置于 django_admin 包中。当您在管理模板中使用 &lt;form action="#" method="get"&gt; 时,您要求原始管理视图处理该请求。由于您的代码位于自定义视图中,因此这可能不是您想要的。您有多种选择:

0) 将您的代码移动到管理视图处理器中。没有发生。

1) 保留表单按钮并设置action="/your/custom/view" 以调用您的自定义视图。如果你这样做,你仍然需要检查请求对象的 GET 参数 (if request.GET.get('export')) 并相应地分支,或者,

2) 放弃表单按钮,只需放置一个标准的&lt;a href&gt; 链接即可调用生成 Excel 文件的视图,避免使用 HTML 表单元素。结果是一个标准的 URL,如 http://hostname.com/attorney/summary/xlsx,可以从任何地方链接。

传递数据

我假设您正在使用related question 中介绍的方法。如果不仔细检查此处示例代码中的细节,您的方法通常是正确的。一些提示:

只有在确定需要它之后才生成查询集。而不是:

attorney_range = Attorney.objects.all().filter(active=True)
if request.GET.get('export'):
    ...

if request.GET.get('export'):
    attorney_range = Attorney.objects.all().filter(active=True)
    ...

您在视图中创建它并将其传递给辅助函数的意图是正确的。无需在辅助函数中重新创建两次。

如果可以,请泛化 WriteToExcel() 函数,这样它就不会关心传入的模型或导出的字段类型。

【讨论】:

以上是关于如何将 CSS 按钮添加到 Django 管理员以实际触发逻辑的主要内容,如果未能解决你的问题,请参考以下文章

将 Facebook 应用程序添加到 Django 以获取 Facebook 页面的权限

如何在 Django 管理中的字段旁边添加自定义按钮?

Django 管理员定制

将“另存为新”按钮添加到 Django 外部对象编辑弹出窗口

使用 Emotion css 将图像添加到按钮

django 社交分享按钮图标