Я пытаюсь отобразить файл docx в моем проекте django, используя данные из поля JSON, но он не может найти файл docx в моей системе.

Это мой views.py

from pathlib import Path

from django.conf import settings
from rest_framework import viewsets
from rest_framework import mixins
from rest_framework.decorators import action
from django.http import HttpResponse

from . import models
from . import serializers

from docxtpl import DocxTemplate
import pypandoc


class TemplateViewSet(
    mixins.ListModelMixin,
    mixins.RetrieveModelMixin,
    viewsets.GenericViewSet,
):
    queryset = models.Template.objects.all()
    serializer_class = serializers.TemplateSerializer

    def get_serializer_class(self):
        return {
            'list': serializers.TemplateSerializer,
            'retrieve': serializers.TemplateSerializer,
            'generate_document': serializers.DocumentGenerateSerializer,
        }.get(self.action, serializers.TemplateSerializer)

    @action(detail=True, url_name='generate-document', methods=['POST', 'GET'])
    def generate_document(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        context_data = serializer.data['context']
        document_extension = serializer.data['extension']
        instance = self.get_object()
        versions = instance.versions.all()
        documents = versions.get(id=instance.id)
        document = DocxTemplate(open('src/media/{}'.format(documents.upload.name.split('.')[0] + '.docx')))
        # document = documents.upload
        document.render(context_data)
        if document_extension == 'docx':
            response = HttpResponse(document, content_type='application/vnd.openxmlformats-officedocument'
                                                           '.wordprocessingml.document')
            response['Content-Disposition'] = 'attachment; filename="{}"'.format(document.name.split('.')[0] + '.docx')
            return response

        else:
            pypandoc.convert_file(document, 'pdf', outputfile=document)
            response = HttpResponse(document, content_type='application/pdf')
            response['Content-Disposition'] = 'attachment; filename="{}"'.format(document.name.split('.')[0] + '.pdf')
            return response

Это мой serializer.py, где я получаю поле JSON. Вся моя проблема в том, что я не могу получить мой docx файл из моей файловой системы или моего postgres.

from rest_framework import serializers
from . import models


class TemplateSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Template
        fields = ['name', 'user']


class VersionSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Version
        fields = ['template', 'upload', 'start_from', 'end_to']


class DocumentGenerateSerializer(serializers.Serializer):
    context = serializers.JSONField(required=True)
    extension = serializers.ChoiceField(choices=['pdf', 'docx'])


Template is being created through my admin.py
from django.contrib import admin
from . import models
from . import forms


class VersionInlineAdmin(admin.StackedInline):
    model = models.Version
    extra = 0


@admin.register(models.Template)
class TemplateAdmin(admin.ModelAdmin):
    inlines = [VersionInlineAdmin]
    form = forms.TemplateCreationForm
    version = forms.VersionCreationForm
    list_display = ('name', 'user')

    def get_form(self, request, *args, **kwargs):

        form = super(TemplateAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        if request.user.is_superuser:
            return queryset
        else:
            return queryset.filter(user=request.user)


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

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