Как добавить изображение из ФАЙЛА или URL-адреса

#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)