【问题标题】:Django 1.11: export queryset to csv using classesDjango 1.11:使用类将查询集导出到 csv
【发布时间】:2019-05-09 10:47:40
【问题描述】:

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

我最终得到一个页面未找到 (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'

urls.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>
...

查询结果.csv

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

查询工作没有任何问题。但是,当我单击“下载结果”链接时,我收到“找不到页面”(404) 错误。谁能告诉我我错过了什么?

【问题讨论】:

  • 如果改变你的get_queryset()返回正常的django查询集怎么办?有效吗?
  • 谢谢。那么一个普通的 django 查询集应该是什么样的呢?

标签: python django csv django-templates django-views


【解决方案1】:

您的第一个问题是r'^results'results/csv/results 匹配,因为它不使用$ 来匹配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}

【讨论】:

  • 感谢您的帮助。那么我将如何将与查询结果相同的表单数据传递给该视图呢?
  • 您可以提交表单,与查询结果相同,也可以在链接中包含查询字符串。
  • 我想我遇到的部分问题是我希望能够将查询中的字段留空。我有什么方法可以通过模板传递查询字符串的 kwargs 吗?我的表单对象设置为 required=False。
  • 我不确定您所说的通过模板传递查询字符串的 kwargs 是什么意思。您可以通过将其更改为 &lt;a href="{% url 'query:query-results-csv' %}?{{ request.GET.urlencode }}"&gt;Download Results&lt;/a&gt; 在链接中包含当前查询字符串
  • 谢谢!这非常有帮助!这为我提供了生成 .csv 下载所需的功能。我的 url 模式就像我最初拥有的那样工作,但是能够将查询字符串发送到我的子类是诀窍。你可以编辑你的答案,我会接受的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多