<p>你真的需要使用Ajax吗?它似乎过于复杂了。在</p>
<p>我的应用程序中有excel下载,但它们是标准的Django视图。其中大多数是基于类的泛型视图,我在其中重写了render_to_response方法,并用excel设置了内容类型。在</p>
<p>因此,我有一个对象的标准ListView来生成HTML,并且ExcelListView重写了render to response方法,来编写excel而不是将其传递给HTML模板。在</p>
<pre><code>class ViewToExcel():
"""
This class will implement the excel writing functionality, by overwriting the render_to_response method
"""
headings2attrributes = {} # empty default
def render_to_response(self, context, **response_kwargs):
"""
Returns a response with a an excel sheet.
"""
self.generate_headings() # specific to my application
wbk = xlwt.Workbook()
sheet = wbk.add_sheet('sheet 1')
# Create the HttpResponse object with the appropriate CSV header.
response = HttpResponse(mimetype='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename=Report.xls'
row_num = 0
col_num = 0
## write row of headings
for hd_att in self.headings2attrributes :
sheet.write(row_num, col_num , hd_att[0])
col_num += 1
row_num += 1
object_list = self.get_queryset()
# write rows of data ## again, this is fairly specific to my implementation
for object in object_list: ## go through each object instance in queryset
self.write_object_row(sheet, row_num, 0 , object)
row_num += 1
wbk.save(response)
return response
class MyView(ListView):
"""
This will produce the standard HTML page (which should contain a link to the excel download)
"""
context_object_name = "my_list"
template_name = "sequencing/MyView.html"
def get_queryset(self):
"""
get your objects and populate a queryset / querydict here
"""
...
...
return MyObjects.all().filter(blah, blah= blah)
class MyExcelView( ViewToExcel , MyView):
"""
This view will subclass both the ViewToExcel class as well as MyView.
When it is called it will reuse the get_queryset method from MyView, but will use RenderToResponse from ViewToExcel - producing excel response, rather than HTML
The way I have implemented it is that the MyExcelView provides HeadingsToAttributes dictionary, which is used to write the excel.
"""
headings2attrributes_template = [
['heading', 'attribbute' ] ,
['heading_2', 'callable' ],
</code></pre>