Как сузить экспорт Django DetailView в файл CSV - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь выяснить, как сделать простой экспорт данных в файл CSV.Я нашел пример, который работает ....

def export_data(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="users.csv"'

    writer = csv.writer(response)
    writer.writerow(['username', 'First name', 'Last name', 'Email address'])

    users = User.objects.all().values_list('name','userid')
    for user in users:
    writer.writerow(user)

    return response

Приведенный выше код работает, как и следовало ожидать, экспортируя всех пользователей из User.objects.all () в электронную таблицу.Тем не менее, я пытаюсь сделать это из DetailView и получать только данные для просматриваемого пользователя, а не всю модель, с помощью .all ().

Из того, что я собираю, чтобы сделать это в DetailView, я считаю, что мне нужно сделать что-то вроде ...

class ExportDataDetailView(LoginRequiredMixin,DetailView):
    model = Author
    context_object_name = 'author_detail'

.... А потом, возможно, мне нужнопереопределить get_queryset?Хотя это кажется излишним, потому что я уже в DetailView ...

Спасибо за любые указатели в правильном направлении заранее.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Когда вы используете DetailView, означает, что вы можете использовать только объект.Если вы хотите экспортировать это, вы можете сделать следующее:

class ExportDataDetailView(LoginRequiredMixin,DetailView):

    model = Author
    context_object_name = 'author_detail'

    def render_to_response(self, context, **response_kwargs):
        user = context.get('author_detail')  # getting User object from context using context_object_name
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="users.csv"'
        writer = csv.writer(response)
        writer.writerow(['username', 'First name', 'Last name', 'Email address'])
        writer.writerow([user.username, user.first_name, ...])
        return response

Теперь, если вам нужны данные всех пользователей, вы можете использовать ListView :

from django.views.generic.list import ListView

class ExportDataListView(LoginRequiredMixin,ListView):
    model = Author
    context_object_name = 'authors'

    def render_to_response(self, context, **response_kwargs):
        authors = context.get('authors')  # getting all author objects from context using context_object_name
        users = authors.values_list('name','userid', ...)
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="users.csv"'
        writer = csv.writer(response)
        writer.writerow(['username', 'First name', 'Last name', 'Email address'])
        for user in users:
           writer.writerow(user)
        return response
0 голосов
/ 12 февраля 2019

Когда вы перебираете набор запросов, вам нужно использовать:

for user in users:
   writer.writerow(user.username, user.first_name, user.last_name, user.email)
...