Как сохранить картинку через URL в модель django
Необходимо разработать сервис, на основе фреймворка Django, который позволит загружать изображения с компьютера пользователя, или по ссылке, а затем изменять их размер используя библиотеку Pillow. Изображения должны сохраняться на диск.
У меня получилось реализовать загрузку с компьютера, а вот по ссылке URL не получается.
Моя модель:
from django.db import models
class Image(models.Model):
title = models.CharField(max_length=200)
image = models.ImageField(upload_to='images')
def __str__(self):
return self.title
Моя форма:
from django import forms
class ImageForm(forms.Form):
title_image = forms.CharField(max_length=200, label='Заголовок')
url_image = forms.URLField(max_length=255, label="URL файла", required=False)
image_image = forms.ImageField(label='Файл ', required=False)
Моя вьюха:
from urllib.request import urlopen
import requests
from django.core.files.base import ContentFile, File
from django.core.files.temp import NamedTemporaryFile
from django.shortcuts import render, redirect
from .forms import ImageForm
from .models import Image
def image_upload_view(request):
""" Загрузка файлов пользователем и обработка"""
if request.method == 'POST':
form = ImageForm(request.POST, request.FILES)
if form.is_valid():
if request.POST['url_image']:
print('НЕ ПУСТАЯ УРЛА!')
url = request.POST['url_image']
img_temp = NamedTemporaryFile(delete=True)
img_temp.write(urlopen(url).read())
img_temp.flush()
print(img_temp)
resp = requests.get(url).raw
print(ContentFile(resp))
# all_data['image'] = File(img_temp)
image_save = Image(title=request.POST['title_image'], image=resp)
image_save.save()
img_obj = image_save
return render(request, 'upload_app/index.html', {'form': form, 'img_obj': img_obj})
# # url = request.POST['url_image']
# #
# # # try:
# # resp = requests.get(url)
# # result = urllib.request.urlretrieve(url)
# # print(result)
# # image_save = Image(title=request.POST['title_image'], image=ContentFile(resp.content))
# # image_save.save()
# # img_obj = image_save
# # print(f'Это наш рисунок {resp.content}')
# # print(f'"POST - {request.POST}')
# # return render(request, 'upload_app/index.html', {'form': form, 'img_obj': img_obj})
#
# # except requests.exceptions.RequestException as e:
# # print('Не удалось получить картинку')
#
else:
print(request.POST['title_image'])
print(request.FILES['image_image'])
image_save = Image(title=request.POST['title_image'], image=request.FILES['image_image'])
image_save.save()
img_obj = image_save
return render(request, 'upload_app/index.html', {'form': form, 'img_obj': img_obj})
else:
form.add_error(None, 'Ошибка валидности')
else:
form = ImageForm()
return render(request, 'upload_app/index.html', {'form': form})
Это шаблон:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Загрузка файлов</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-error">{{ form.non_field_errors }}</div>
{% for f in form %}
<p><label class="form-label" for="{{ f.id_for_label }}">{{f.label}}: </label>{{ f }}</p>
<div class="form-error">{{ f.errors }}</div>
{% endfor %}
<button type="submit">Сохранить на диск</button>
</form>
{% if img_obj %}
<h3>Файл загружен успешно : {{ img_obj.title }}</h3>
<img src="{{ img_obj.image.url }}" alt="connect" style="max-height:300px">
<img src="https://i.ytimg.com/vi/vEYsdh6uiS4/maxresdefault.jpg">
<p>Оригинальный размер картинки {{ img_obj.image.width }}x{{ img_obj.image.height }}</p>
{% endif %}
{{ request.FILES }}
</body>
</html>
Я новичок, прошу не судить строго) Может кто-то сталкивался с такой задачей