3

我试图以两种方式从视图中呈现内容: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
4

2 回答 2

5

您可以在 url 中使用参数并实现类似的视图

def myview(request) :

    type = request.GET.get('type', 'html')

    # do processing
    if type == 'html':
        # return html
    else if type == 'csv':
        # return csv

如果您访问这样的 url http://yourserver/myview?type=csv,它将呈现视图的 csv 部分。访问url 时http://yourserver/myview,它将返回视图的 html 部分。

于 2013-03-25T11:37:50.083 回答
1

罗汉的回答绝对是正确的范式。有关此主题的出色教程式介绍,请参阅。Django 中的多个模板

这里有一些引述(所有功劳归于 Scott Newman)。

例如,要提供文章的可打印版本,我们可以将 ?printable 添加到 URL 的末尾。

为了让它工作,我们将在我们的视图中添加一个额外的步骤来检查这个变量的 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))

他继续按域名进行模板覆盖和不同模板。这一切都很棒。

于 2013-08-16T08:15:05.817 回答