如何从文件或URL添加图像

2024-04-26 18:33:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试添加来自FileField或URL CharField(URL)的图像,但我遇到了一些问题。 第一>;URL中的文件已正确上载,模型中的名称和图像已成功创建,但。。图像不正确(请参阅下面的代码) 第二>;如果选择了文件,一切都是完美的

我从Name中获取POST值,对其进行slugify,并在两种情况下使用它以扩展名更改图像的名称。。。 当我选择一个url。。。模型中图像的结果是:halo/.jpg。。。我只是想从刚从url上传的文件中获取值

换句话说:如果URL字段已填充。。。我使用这个URL而不是文件,如果不是,我使用文件字段来上传

谢谢你的帮助

视图.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)

型号.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条回答
网友
1楼 · 发布于 2024-04-26 18:33:37

我终于自己找到了;) 我刚刚修改了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)

相关问题 更多 >