Как добавить изображение из файла или URL
Я пытаюсь добавить изображение из FileField или URL CharField (Url), но у меня возникла проблема. 1-й > Файл из URL загружается правильно, имя и изображение в моделях успешно создаются, но ... изображение не правильное (см. код ниже). 2-ой > Если файл выбран, то все идеально!
Я получаю значение POST из Name , slugify его и использую его для изменения имени изображения с расширением в обоих случаях ... Когда я выбираю url ... Результат для изображения в Models: halo/.jpg ... Я просто хочу получить обратно значение из файла, только что загруженного по url...
Другими словами: Если поле URL заполнено... я использую этот URL вместо File, если нет, то я использую FileField для загрузки.
Спасибо за помощь
VIEWS.PY
def createHalo(request):
form = HaloForm()
if request.method == 'POST':
form = HaloForm(request.POST, request.FILES)
if form.is_valid():
document = form.save(commit=False)
document.name = request.POST['name']
img_url = request.POST['url']
if img_url != "":
print(img_url)
photo = Halo() # set any other fields, but don't commit to DB (ie. don't save())
filename = urlparse(img_url).path.split('/')[-1]
extension = filename.split(".")[-1].lower()
name = "halo/" + slugify(request.POST['name']) + "." + extension
# content = urllib.request.urlretrieve(img_url)
response = requests.get(img_url)
if response.status_code == 200:
photo.image.save(name, ContentFile(response.content), save=False)
print(name)
# photo.image.name = name
# photo.save()
document.save()
# Halo.save()
else:
document.save()
message = "Image ["+request.POST['name'] + "] ajoutée avec succès !"
messages.success(request, message)
return redirect('games:create_halo')
context = {'form': form}
return render(request, 'games/createHalo.html', context)
MODELS.PY
class Halo(models.Model):
objects = models.Manager()
name = models.CharField(max_length=200, db_index=True)
image = models.ImageField(upload_to='', storage=fs)
# Methode d'enregistrement dans la base ...
def save(self, *args, **kwargs):
# On check si Object Mot déjà créé
# On test ensuite si l'image de la base est identique à celle envoyée par le formulaire
# Si différent on supprime l'ancien fichier pour uploader le nouveau lors de la sauvegarde du modèle
try:
this = Halo.objects.get(pk=self.pk)
if this.image != self.image:
this.image.delete()
except:
this = self
extension = self.image.name.split(".")[-1].lower()
self.image.name = "halo/" + slugify(self.name) + "." + extension
# Si le fichier existe on le renomme avec la valeur du nouveau mot (cas ou seul le mot change ... pas le fichier)
if os.path.exists(settings.MEDIA_ROOT + "/" + this.image.name):
os.rename(settings.MEDIA_ROOT + "/" + this.image.name, settings.MEDIA_ROOT + '/halo/' + slugify(self.name) + "." + extension)
super(Halo, self).save(*args, **kwargs)
FORMS.PY
class HaloForm(ModelForm):
image = forms.ImageField(widget=forms.FileInput, required=False)
url = forms.CharField(max_length=255, required=False)
class Meta:
model = Halo
fields = ('name', 'image', 'url')
Я наконец-то нашел сам ;) Я просто изменил VIEWS.PY, чтобы реорганизовать и изменить некоторые переменные. Возможно, есть другое решение, более эффективное, но это работает ;)
def createHalo(request):
form = HaloForm()
if request.method == 'POST':
form = HaloForm(request.POST, request.FILES)
if form.is_valid():
img_url = request.POST['url']
if img_url != "":
response = requests.get(img_url)
if response.status_code == 200:
photo = Halo() # set any other fields, but don't commit to DB (ie. don't save())
filename = urlparse(img_url).path.split('/')[-1]
extension = filename.split(".")[-1].lower()
name = "halo/" + slugify(request.POST['name']) + "." + extension
photo.image.save(name, ContentFile(response.content), save=False)
photo.image.name = name
photo.name = request.POST['name']
photo.save()
else:
document = form.save(commit=False)
document.name = request.POST['name']
document.save()
message = "Image ["+request.POST['name'] + "] ajoutée avec succès !"
messages.success(request, message)
return redirect('games:create_halo')
context = {'form': form}
return render(request, 'games/createHalo.html', context)