我试图以两种方式呈现视图中的内容:html和csv下载。我能够做到的唯一方法是使用2个不同的视图,一个用于html演示,一个用于csv。这复制了我的代码,我正在寻找一个更优雅的解决方案。 有什么建议吗?
以下是示例代码:
# views.py
[...]
def member_list(request):
member_list = Member.objects.all()
return render_to_response("member_list.html",
{'member_list':member_list)
def member_csv_list(request):
member_list = Member.objects.all()
csv_list = HttpResponse(content_type='text/csv')
csv_list['Content-Disposition'] = 'attachment; filename="member_list.csv"'
writer = csv.writer(csv_list)
writer.writerow(['Name', 'Member Type', 'Rooms'])
for member in member_list:
fields = [member.name, member.member_type, member.room]
writer.writerow(fields)
return member_list
答案 0 :(得分:5)
您可以在网址中使用参数并实施类似
的视图def myview(request) :
type = request.GET.get('type', 'html')
# do processing
if type == 'html':
# return html
else if type == 'csv':
# return csv
如果您访问http://yourserver/myview?type=csv
之类的网址,则会呈现视图的csv部分。当访问URL http://yourserver/myview
时,它将返回视图的html部分。
答案 1 :(得分:1)
以下是一些引用(所有信用均归Scott Newman所有)。
例如,要提供文章的可打印版本,我们可以在网址末尾添加?printable。
为了使其有效,我们将在视图中添加一个额外步骤来检查此变量的URL。如果存在,我们将加载打印机友好的模板文件。如果它不存在,我们将加载普通的模板文件。
def detail(request, pid):
'''
Accepts a press release ID and returns the detail page
'''
p = get_object_or_404(PressRelease, id=pid)
if request.GET.has_key('printable'):
template_file = 'press/detail_printable.html'
else:
template_file = 'press/detail.html'
t = loader.get_template(template_file)
c = Context({'press': p})
return HttpResponse(t.render(c))
他继续使用模板覆盖和按域名模板覆盖。这一切都很棒。