#python #django
Вопрос:
Я пытаюсь добавить изображение из поля файла или поля URL-адреса (Url), но у меня возникли некоторые проблемы. 1-й > Файл с URL-адреса загружен правильно, имя и изображение в моделях успешно созданы, но .. Изображение неверно (см. Код ниже) 2-е > Если файл выбран, все идеально !
Я получаю значение ПОСТА из имени , удаляю его и использую для изменения имени изображения с расширением в обоих случаях … Когда я выбираю URL-адрес … Результат для изображения в моделях : halo/.jpg … Я просто хочу вернуть значение из файла, только что загруженного с URL-адреса…
Другими словами : Если поле URL заполнено … Я использую этот URL-адрес вместо файла, если нет, я использую поле Файл для загрузки.
Спасибо за помощь
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')
Ответ №1:
Наконец-то я нашел себя сам 😉 Я просто изменил ПРЕДСТАВЛЕНИЯ.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)