我在使用此处建议的查询类的子类将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>
...
QueryResults.csv
Date, City, Name, Sex
{% for object in object_list %}
{{object.date}},{{object.city}},{{object.name}},{{object.sex}}
{% endfor %}
查询有效,没有任何问题。但是,当我单击“下载结果”链接时,出现“找不到页面(404)”错误。有人可以告诉我我想念什么吗?
答案 0 :(得分: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}