Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django 1.11:使用类将queryset导出到csv_Python_Django_Csv_Django Templates_Django Views - Fatal编程技术网

Python Django 1.11:使用类将queryset导出到csv

Python Django 1.11:使用类将queryset导出到csv,python,django,csv,django-templates,django-views,Python,Django,Csv,Django Templates,Django Views,我在使用我的查询类的子类将Django查询的结果导出到csv时遇到问题,如这里所建议的 我最终得到一个页面未找到(404)错误。这是相关代码 views.py class QueryResultsView(ListView): template_name = 'query/query_results.html' model = StDetail context_object_name = "object_list" def get_queryset(self)

我在使用我的查询类的子类将Django查询的结果导出到csv时遇到问题,如这里所建议的

我最终得到一个页面未找到(404)错误。这是相关代码

views.py

class QueryResultsView(ListView):

    template_name = 'query/query_results.html'
    model = StDetail
    context_object_name = "object_list"

    def get_queryset(self):
        form_input = self.request.GET
        filters = {"person_name": form_input.get('name'),
                   "city": form_input.get('city'),
                  }
        # delete keys that are None
        filters = {k: v for k, v in filters.items() if v is not ''}
        self.detail_data = get_list_or_404(self.model, **filters)
        return(self.detail_data)

    def get_context_data(self, **kwargs):
        context = super(QueryResultsView, self).get_context_data(**kwargs)
        context['query_results'] = self.get_queryset()
        return(context)

class QueryResultsCsvView(QueryResultsView):

    # Subclass of above view, to produce a csv file
    template_name = 'query/QueryResults.csv'
    content_type = 'text/csv'
url.py

app_name = QueryConfig.name
urlpatterns = [
...
    url(r'^query',
        QueryFormView.as_view(),
        name='person-query'),
    url(r'^results',
        QueryResultsView.as_view(),
        name='query-results'),
    url(r'^results/csv/$',
        QueryResultsCsvView.as_view(),
        name='query-results-csv'),
]
query_results.html

...
<a href="{% url 'query:query-results-csv' %}">Download Results</a>
...

查询工作没有任何问题。然而,当我点击下载结果链接时,我得到一个页面未找到(404)错误。有人能告诉我我遗漏了什么吗?

你的第一个问题是
r'^results'
匹配
results/csv/
以及
results
,因为它不使用
$
匹配URL的结尾

尝试以下方法(我添加了尾随斜杠以匹配通常的Django样式)

完成此操作后,下一个问题是,您只需链接到
查询结果csv
结果视图,但没有向其传递任何表单数据。在
查询结果
视图的模板中,您可以将同一查询字符串更改为:

<a href="{% url 'query:query-results-csv' %}?{{ request.GET.urlencode }}">Download Results</a>

如果更改您的
get\u queryset()
返回到正常的django queryset会怎么样?有用吗?谢谢。那么一个普通的django queryset应该是什么样子呢?谢谢你的帮助。那么,我该如何向该视图传递与查询结果相同的表单数据呢?您可以提交表单,提交方式与提交查询结果的方式相同,也可以在链接中包含查询字符串。我想我遇到的部分问题是,我希望能够将查询中的字段留空。我有没有办法通过模板传递查询字符串的KWARG?我的表单对象被设置为required=False。我不确定通过模板传递查询字符串的kwargs是什么意思。您可以将当前的查询字符串更改为
谢谢!这是非常有帮助的!这为我提供了生成.csv下载所需的功能。我的url模式的工作原理与我最初使用的相同,但是能够将查询字符串发送到我的子类是关键。你可以修改你的答案,我会接受的。
urlpatterns = [
    url(r'^query/$',
        QueryFormView.as_view(),
        name='person-query'),
    url(r'^results/$',
        QueryResultsView.as_view(),
        name='query-results'),
    url(r'^results/csv/$',
        QueryResultsCsvView.as_view(),
        name='query-results-csv'),
]
<a href="{% url 'query:query-results-csv' %}?{{ request.GET.urlencode }}">Download Results</a>
filters = {k: v for k, v in filters.items() if v}