Я пытаюсь отобразить файл 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