Как отправить данные в документ word с помощью Django?

Я использую Django Я хочу отправить некоторые данные из моей базы данных в документ word, я использую py-Docx для создания документов word Я использую класс ExportDocx он может генерировать статический файл word, но я хочу поместить некоторые динамические данные (например, product id =5, name=""...) в основном все детали к "продукту" в документ

class ExportDocx(APIView):
  def get(self, request, *args, **kwargs):
    queryset=Products.objects.all()
    # create an empty document object
    document = Document()
    document = self.build_document()

    # save document info
    buffer = io.BytesIO()
    document.save(buffer)  # save your memory stream
    buffer.seek(0)  # rewind the stream

    # put them to streaming content response 
    # within docx content_type
    response = StreamingHttpResponse(
        streaming_content=buffer,  # use the stream's content
        content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    )

    response['Content-Disposition'] = 'attachment;filename=Test.docx'
    response["Content-Encoding"] = 'UTF-8'

    return response

 def build_document(self, *args, **kwargs):
    document = Document()
    sections = document.sections
    for section in sections:
        section.top_margin = Inches(0.95)
        section.bottom_margin = Inches(0.95)
        section.left_margin = Inches(0.79)
        section.right_margin = Inches(0.79) 

    # add a header
    document.add_heading("This is a header")

    # add a paragraph
    document.add_paragraph("This is a normal style paragraph")

    # add a paragraph within an italic text then go on with a break.
    paragraph = document.add_paragraph()
    run = paragraph.add_run()
    run.italic = True
    run.add_text("text will have italic style")
    run.add_break()
    
    return document

Этот URL.py из

    path('<int:pk>/testt/', ExportDocx.as_view() , name='generate-testt'),

Как я могу сгенерировать его, я думаю, мне нужно сделать данные строковыми, чтобы они могли работать с py-docx.

для документации по py-docx : http://python-docx.readthedocs.io/

Так я обнаружил, что мне нужно передать модель, я делал это, но в другой версии кода и забыл добавить... В общем, мне просто пришлось добавить эти строки кода, надеюсь, это поможет тому, кто это читает.

def get(self, request,pk, *args, **kwargs):
    # create an empty document object
    document = Document()
    product = Product.objects.get(id=pk)
    document = self.build_document(product)

А в сборке документа нам нужно просто строгифицировать его, используя f'{queryset.xxxx}'

def build_document(self,queryset):
    document = Document()
    document.add_heading(f'{queryset.first_name}')

Для записи о товаре типа: record = {"product_id": 5, "name": "Foobar"), you can add it to the document in your построить_документ()` метод типа:

document.add_paragraph(
    "Product id: %d, Product name: %s"
    % (record.product_id, record.name)
)

Существуют и другие более современные методы интерполяции строк, хотя этот стиль sprintf отлично подходит для большинства случаев. Этот ресурс, возможно, неплохое место для начала.

Вернуться на верх