Скачать документ, созданный с помощью python-docx - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь экспортировать отчет о словах в Odoo, я использую библиотеку python-docx,

Код:

document = Document()            

records = result

table = document.add_table(rows=0, cols=4,style='Table Grid')  
for att  in records:
    row_cells = table.add_row().cells
    cnt = 0  
    for attdet  in att:
        #row_cells[0].style('text-align: center;vertical-align: middle;') 
        if (cnt == 0):
            row_cells[0].add_paragraph(attdet.serial_no, 'List Bullet')#[0].text = attdet.serial_nobold
            row_cells[1].add_paragraph(attdet.name, 'List Bullet')#[1].text = attdet.name
        else:
            row_cells[2].add_paragraph(attdet.serial_no, 'List Bullet')#.text = attdet.serial_no
            row_cells[3].add_paragraph(attdet.name, 'List Bullet')#.text = attdet.name
        cnt = cnt+1

document.add_page_break()

pdfhttpheaders = [('Content-Type','application/msword')]
return request.make_response(document, headers=pdfhttpheaders)

Вместо сохранения документа в папку, мне нужно скачать этот текстовый документ по нажатию кнопки,

Я получаю ошибку ниже,

AttributeError: 'JsonRequest' object has no attribute 'make_response'

Пожалуйста, помогите мне решить эту ошибку.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

С моей точки зрения, вы должны изменить способ производства и получить документ именно там, где документ произведен и доступен.

Более простой способ сделать это, я думаю, что это будет использовать кнопку для возврата действия url dict, чтобы перенаправить запрос на контроллер с правильными данными в строке запроса, чтобы иметь возможность генерировать документ как ответ, как вы это делаете. Что-то вроде:

return {
    'type': 'ir.actions.act_url',
    'url': '/report/docx/content/custom',
    'target': 'self',
}

Затем вы можете поместить свой код, который генерирует отчет docx, в контроллер метода, как показано ниже:

from odoo import http, tools, _
from odoo.http import request, Controller

class CustomController(Controller):

    @http.route(['/report/docx/content/custom'], type='http', auth="public")
    def report_docx(self, **kwargs):
        # your code of report generation that use request.make_response

Просто передайте достаточно информации контроллеру, используя строку запроса URL-адреса, такую ​​как идентификатор записи, или любые другие данные, которые могут вам понадобиться в контроллере, но обычно идентификатора записи будет достаточно

0 голосов
/ 06 сентября 2018

Что ж, я подозреваю, что здесь больше неправильного, чем это, но вам нужно сначала сохранить документ, возможно, в io.BytesIO поток, подобный этому:

import io

# ...

docx_stream = io.BytesIO()
document.save(docx_stream)
docx_bytes = docx_stream.getvalue()

Значение docx_bytes является фактическим содержимым результирующего файла .docx, который вы хотите получить в ответе. Значение document - это просто граф объектов в памяти, представляющий документ и не имеющий прямого соответствия файлу .docx (кроме того, что он может создать его, используя метод .save().

Я подозреваю, что ответ должен быть составным, но, возможно, кто-то, кто знает больше об Odoo, сможет помочь вам с этой частью.

Кроме того, я считаю, что тип контента должен быть application/vnd.openxmlformats-officedocument.wordprocessingml.document для правильной работы. Тот, который у вас есть ('application / msword'), предназначен для более старого формата .doc (Word 2003 и более ранних версий).

Я не уверен, что означает использование имени pdfhttpheaders. Это не имеет ничего общего с форматом PDF. Я ожидаю, что http_headers будет более разумным выбором для этого идентификатора.

...