Как добавить изображение из файла или 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)
Вернуться на верх