首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向csv下载Django搜索结果

向csv下载Django搜索结果
EN

Stack Overflow用户
提问于 2022-04-27 21:37:48
回答 2查看 147关注 0票数 0

作为一种选择,我正在尝试从搜索结果下载一个CSV。这意味着用户应该能够进行搜索并在模板中查看结果,然后根据需要下载该搜索结果的csv。模板不是问题,而是我需要解决的视图。我有以下意见:

首先是搜索视图。

代码语言:javascript
复制
def binder_search(request):
    if request.method == "POST":
        searched = request.POST['searched']
        binders_searched = Binders.objects.filter(Q(description__contains=searched) | Q(step__name__contains=searched) | Q(status__name__contains=searched))

        return render(request, "binder_search.html", {'searched': searched, 'binders_searched': binders_searched})

    else:
        return render(request, "binder_search.html", {})

然后是csv。此视图创建数据库中所有项的列表。我要做的是从上面的视图获取搜索结果,然后创建csv文件。我最终会得到一个CSV文件,其中只有搜索结果。

代码语言:javascript
复制
def binders_csv(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=binders_result.csv'

    # create a csv writer
    writer = csv.writer(response)

    # designate the model
    binders = Binders.objects.all()

    # add column at the heading of csv file
    writer.writerow(['Item Code', 'Description', 'Item Type', 'Current Step', 'Current Status', 'Last change by'])

    # loop thru and output
    for binder in binders:
        writer.writerow([binder.itemcode, binder.description, binder.itemtype, binder.step, binder.status, binder.user])

    return response

我环顾四周看了看不同的解决方案,但实际上没有一个方案是我的。知道怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-28 15:35:31

下面是一个有效的解决方案--在nigel222和会话框架(request.session)的帮助下完成。此解决方案提供了将搜索结果显示到模板中所需的视图,然后按下按钮或链接将确切结果下载到CSV格式。因此,用户可以获得一个搜索结果,然后如果他愿意,可以下载结果。我一直在四处寻找,但没有找到类似的解决方案,所以我在这里为其他人张贴它。

第一个视图(binder_search)执行搜索,并使用request.session缓存变量“搜索”。

代码语言:javascript
复制
def binder_search(request):
    if request.method == "GET":
        searched = request.GET['searched']

        # Cache variable "searched" for views.binder_search_csv
        request.session['searched'] = searched

        # multiple columns
        binders_searched = Binders.objects.filter(Q(description__contains=searched) | Q(step__name__contains=searched) | Q(status__name__contains=searched))
        return render(request, "binder_search.html", {'searched': searched, 'binders_searched': binders_searched})
    
    else:
        return render(request, "binder_search.html", {})

第二个视图使用上述视图中的缓存变量“搜索”,并将搜索结果下载到csv文件中。

代码语言:javascript
复制
def binder_search_csv(request):
    if request.method != "GET":
        return render(request, "binder_search.html", {})

    # Use cached variable from views.binder_search
    searched = request.session['searched']

    binders_searched = Binders.objects.filter(Q(description__contains=searched) | Q(step__name__contains=searched) | Q(status__name__contains=searched))

    # create a csv writer with header writing to response
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=binders_result.csv'
    writer = csv.writer(response)
    writer.writerow(['Item Code', 'Description', 'Item Type', 'Current Step', 'Current Status', 'Last change by'])

    # loop thru filtered results and output
    for binder in binders_searched:
        writer.writerow(
            [binder.itemcode, binder.description, binder.itemtype, binder.step, binder.status, binder.user]
        )
    return response

也许有办法简化这两个视图,但就像它们现在的情况一样,它们工作得很好。

票数 0
EN

Stack Overflow用户

发布于 2022-04-28 08:44:17

我遗漏了什么?你就不能把两者结合起来吗?

代码语言:javascript
复制
def binder_search(request):
    if request.method != "POST":
        return render(request, "binder_search.html", {})

    # POST

    searched = request.POST['searched']
    binders_searched =   Binders.objects.filter(Q(description__contains=searched) | Q(step__name__contains=searched) | Q(status__name__contains=searched))

    # create a csv writer with header writing to response
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=binders_result.csv'
    writer = csv.writer(response)
    writer.writerow(['Item Code', 'Description', 'Item Type', 'Current Step', 'Current Status', 'Last change by'])

    # loop thru filtered results and output
    for binder in binders_searched:
        writer.writerow(
            [binder.itemcode, binder.description, binder.itemtype, binder.step, binder.status, binder.user]
        )
    return response
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72035579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档