Как получить 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')