Генерация PDF отчета в Django Rest Framework
У меня уже есть представление, которое отвечает с данными, я хочу генерировать PDF из тех же данных, будет ли возможно отобразить шаблон с serializer.data любое другое решение для генерации PDF на бэкенде приветствуется...
Сериализатор .
class UsersAuditTrailSerializer(serializers.ModelSerializer): """ Журнал аудита пользователей """ изменения = serializers.SerializerMethodField() операция = serializers.SerializerMethodField() owner = serializers.StringRelatedField(source='history_user.displayname',read_only=True) id = serializers.IntegerField(source='history_id') user_id = serializers.IntegerField(source='id')
def get_operation(self,obj):
operation_type = {'+': 'Created', '~': 'Updated', '-': 'Deleted'}
return operation_type[obj.history_type]
def get_changes(self, obj):
change_log = ""
current = obj
previous = obj.prev_record
if previous:
delta = current.diff_against(previous)
for cng in delta.changes:
if cng.field == 'password':
change_log+="User Password Changed"
continue
if cng.field == 'name':
continue
change_log+="Field : '{}' Changed from {} to {} ,".format(cng.field, cng.old, cng.new)
elif current.history_type == "+":
change_log ="User created"
else:
pass
return change_log
class Meta:
model = User.history.model
fields = ['id', 'user_id', 'displayname', 'owner','history_date', 'operation','changes']
Views.py:
class UsersAuditTrailPDFView(generics.ListAPIView): """ Журнал аудита пользователей и их отчет о журнале изменений"""" serializer_class = serializers.UsersAuditTrailSerializer permission_classes = (permissions.IsAuthenticated,) filter_backends = (filters.DjangoFilterBackend,OrderingFilter) filter_class = UsersAuditTrailFilterSet queryset = User.history.all()
def get(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
template_path = '../login/rpt/templates/user_report.html'
serializer = self.get_serializer(queryset, many=True)
context = serializer.data
# # find the template and render it.
template = get_template(template_path)
html = template.render(context)
response = Response(content_type='application/pdf')
# # create a pdf
pisa_status = pisa.CreatePDF(
html, dest=response)
# # if error then show some funny view
if pisa_status.err:
return HttpResponse('We had some errors <pre>' + html + '</pre>')
response['Content-Disposition'] = 'attachment; filename="report.pdf"'
response = Response("TEST")
return response