Как получить url нескольких изображений, хранящихся в папке, в Django

Я разрабатываю приложение на django, которое конвертирует pdf в изображения. Я использую FileField для этой цели и использую ModelForms. После загрузки файлы pdf будут преобразованы в .png и сохранены в отдельной папке. Загрузка и преобразование pdf в png работает нормально, но теперь я хочу отобразить преобразованные изображения.

Я знаю, что могу использовать url загруженного изображения для его отображения, но проблема в том, что я загружаю файл pdf и поэтому не могу использовать url для его отображения. Я знаю, как отобразить загруженное изображение, используя url этого изображения. Но я загружаю файл pdf, конвертирую его в изображение и сохраняю в отдельной папке. Как же мне отобразить сохраненные изображения? Ниже приведен код, который я использую:

forms.py

from django import forms
from django.forms import ClearableFileInput
from app1.models import UserUploadModel

class UserUploadForm(forms.ModelForm):
    

    class Meta:

        model = UserUploadModel
        fields = ['file']
        widgets = {
            'file' : ClearableFileInput(attrs = {'multiple': True}),
        }

models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class UserUploadModel(models.Model):
    
    user = models.ForeignKey(User, on_delete = models.CASCADE, null = True)
    file = models.FileField(upload_to = 'file_uploads')

views.py

from django.shortcuts import render, redirect
from app1.forms import UserUploadForm
from app1.models import UserUploadModel
from app1.convert import convert_file
from app1.transfer import move_dir
import os
from project1 import settings
from django.contrib.auth.decorators import login_required

@login_required
def home(request):
    
    if request.method == 'POST':
        form = UserUploadForm(request.POST, request.FILES)
        
        if form.is_valid():
          
            files = request.FILES.getlist('file')
            
            f_list = []
            
            if files:
                for i in files:
                    file_instance = UserUploadModel(file = i, user = request.user)
                    file_instance.save()
                    f_list.append(file_instance.file.path)
                
                [convert_file(j) for j in f_list]
                
    
                src_dir = os.getcwd()
                dest_dir = os.path.join(src_dir, 'media/converted_files')          
                move_dir(src_dir, dest_dir, '*.png')                
            
            return redirect('app1-display')
        
    else:
        
        form = UserUploadForm()
    
    return render(request, 'app1/home.html', {'form' : form})


@login_required
def display(request):
    
    images = UserUploadModel.objects.filter(user = request.user)

    context = {
        'images' : images
        }
    
    return render(request, 'app1/display.html', context)

home.html

{%extends "app1/base.html"%}
{%block content%}

    <form method="POST" enctype="multipart/form-data">
      {%csrf_token%}
      {{form.as_p}}
      <input type="submit">
    </form>

{%endblock content%}

display.html

{%extends "app1/base.html"%}
{%load static%}
{%block content%}

    {%if user.is_authenticated%}
        <h2>User: {{request.user.username}}</h2>
    {%endif%}

    {%if images%}
        {%for i in images%}
            <img src={{ i.file.url }}>
        {%endfor%}
    {%endif%}
    
{%endblock content%}

Неправильный подход измените модель и сделайте поле файла для преобразованного pdf также. После конвертации сохраните файл в этом поле модели. Тогда вы сможете получить url преобразованного файла.

Я не уверен, но можно ли использовать PIL для открытия изображения, а затем использовать Django File Response для возврата изображения. from PIL import Image from django.http import FileResponse

def display(request): images = UserUploadModel.objects.filter(user = request.user) if images: image = Image.open(images[0].file.path) return FileResponse(image, content_type='image/png')

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