如何将 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;
我对@987654322@ 模板所做的更改以使我的按钮可见(我将其放在管理员更改列表的搜索栏之后):
% 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
包中。当您在管理模板中使用 <form action="#" method="get">
时,您要求原始管理视图处理该请求。由于您的代码位于自定义视图中,因此这可能不是您想要的。您有多种选择:
0) 将您的代码移动到管理视图处理器中。没有发生。
1) 保留表单按钮并设置action="/your/custom/view"
以调用您的自定义视图。如果你这样做,你仍然需要检查请求对象的 GET 参数 (if request.GET.get('export')
) 并相应地分支,或者,
2) 放弃表单按钮,只需放置一个标准的<a href>
链接即可调用生成 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 页面的权限