Django 1.11:使用类将查询集导出到 csv

用户14241

我无法按照此处的建议使用我的查询类的子类将 Django 查询的结果导出到 csv。https://stackoverflow.com/a/29678525/3973597

我最终遇到找不到页面 (404) 错误。这是相关的代码...

视图.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'

网址.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'),
]

查询结果.html

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

查询结果.csv

Date, City, Name, Sex
{% for object in object_list %}
{{object.date}},{{object.city}},{{object.name}},{{object.sex}}
{% endfor %}

查询工作没有任何问题。但是,当我单击下载结果链接时,出现找不到页面 (404) 错误。有人可以告诉我我错过了什么吗?

阿拉斯代尔

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

尝试如下操作(我添加了尾部斜杠以匹配通常的 Django 样式)。

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-csv结果视图,但没有将任何表单数据传递给它。query-results视图的模板中,您可以通过将相同的查询字符串更改为:

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

最后,请注意,如果键不存在,则form_input.get(key)返回None,因此您的过滤器应该使用if v而不是if v is not ''(如果您真的只想排除带有空字符串的值,则应该使用if v != '')。

filters = {k: v for k, v in filters.items() if v}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章