Django 1.11: экспорт набора запросов в csv с использованием классов - PullRequest
0 голосов
/ 07 декабря 2018

У меня проблемы с экспортом результатов запроса 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).Может кто-нибудь сказать мне, что мне не хватает?

1 Ответ

0 голосов
/ 07 декабря 2018

Ваша первая проблема заключается в том, что 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...