Вывести файл CSV без загрузки - PullRequest
1 голос
/ 04 июля 2019

Я делаю простой просмотр и хочу, чтобы ответ был файлом CSV, но я не хочу, чтобы проводник загружал его.

Здесь я покажу вам ответ, который я даю:

    def csv_response(self, fields, queryset=None, filename=None):
        if not queryset:
            try:
                queryset = self.get_queryset()
            except AttributeError:
                raise ImproperlyConfigured('This method needs to have a queryset configured.')
        if not filename:
            filename = self.__class__
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'inline'

        writer = csv.DictWriter(response, fieldnames=fields.keys(), delimiter=',')
        writer.writeheader()

        for element in queryset:
            writer.writerow({fieldname: getattr(element, field) for fieldname, field in fields.items()})
        return response

Я просто хочу, чтобы он выводил его в любом проводнике, а не загружал, возможно ли это?Я думаю, что это так, как я видел некоторые в Интернете.

РЕДАКТИРОВАТЬ: я пытался изменить:

response = HttpResponse(content_type='text/plain', charset='utf-8')

, и тогда вывод не загружается сразу, но символы сакценты не имеют правильных символов.Я не понимаю эту последнюю партию, так как я установил charset = 'utf-8'.В качестве проверки я увидел, что заголовки в последнем html, отображаемом de explorer, не имеют установленного параметра charset.

Ответы [ 3 ]

1 голос
/ 04 июля 2019

Я наконец решил проверить код других CSV-файлов в сети. Спасибо @Tal за то, что его ответ направил меня таким образом.

Код работает так, как я хотел:

    def csv_response(self, fields, queryset=None, filename=None):
        if not queryset:
            try:
                queryset = self.get_queryset()
            except AttributeError:
                raise ImproperlyConfigured('This method needs to have a queryset configured.')
        if not filename:
            filename = self.__class__
        response = HttpResponse()
        response['Content-Type'] = 'text/plain; charset=utf-8'
        response['Content-Disposition'] = 'inline'

        writer = csv.DictWriter(response, fieldnames=fields.keys(), delimiter=',')
        writer.writeheader()

        for element in queryset:
            writer.writerow({fieldname: getattr(element, field) for fieldname, field in fields.items()})
        return response
0 голосов
/ 04 июля 2019

Вы можете просто вернуть String ответ CSV, и таким образом он будет отображаться в браузере без загрузки

from io import StringIO

def csv_response(self, fields, queryset=None, filename=None):
    if not queryset:
        try:
            queryset = self.get_queryset()
        except AttributeError:
            raise ImproperlyConfigured('This method needs to have a queryset configured.')
    if not filename:
        filename = self.__class__

    output = StringIO()
    writer = csv.DictWriter(output, fieldnames=fields.keys(), delimiter=',')
    writer.writeheader()

    for element in queryset:
        writer.writerow({fieldname: getattr(element, field) for fieldname, field in fields.items()})
    return HttpResponse(output.getvalue())
0 голосов
/ 04 июля 2019

Да, это возможно. Вместо того, чтобы возвращать объект ответа, вы можете использовать tabulate для преобразования csv в html и возврата html / или любого необходимого текстового формата, который вы можете использовать в своем представлении.

Подробнее о том, как использовать таблицу

ссылка на табличный документ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...