更改ImageField URL

0 投票
1 回答
23 浏览
提问于 2025-04-14 16:52

我正在尝试通过调用页面模型中的correct_image_url方法来修正我的图片网址。但是,不知道为什么,结果没有被保存。因此,虽然这个方法运行得很好,但在我执行以下代码的那一步:

print(f"New URL of the page: {new_image_url}")

它却返回了旧的网址。

class Page(models.Model):
    image = models.ImageField(
        max_length=400,
        storage=S3Boto3Storage(),
        validators=[FileSizeValidator(limit_value=8)])
    number = models.PositiveIntegerField(default=0, blank=True, null=True)
    chapter = models.ForeignKey(Chapter, on_delete=models.CASCADE)

    objects = PageManager()

    def correct_image_url(self):
        url = self.image.url
        corrected_url = url.replace(
            "https%3A/dist.cloudfront.net", "https://dist.cloudfront.net")

        domain = "https://dist.cloudfront.net"
        first_occurrence = corrected_url.find(domain)
        second_occurrence = corrected_url.find(
            domain, first_occurrence + len(domain))

        if second_occurrence != -1:
            corrected_url = corrected_url[:second_occurrence]

        if corrected_url != url:
            if self.image:
                original_url = self.image.url
                print(
                    f"Correcting URL from: {original_url} to {corrected_url}")
                self.image = corrected_url
                try:
                    self.save()
                    self.refresh_from_db()
                    new_image_url = self.image.url
                    print(f"New URL of the page: {new_image_url}")
                except DataError:
                    print(
                        f"Skipped saving due to DataError for URL: {corrected_url}")
                except ValidationError as e:
                    print(
                        f"Validation error: {e.messages} for URL: {corrected_url}")

我在Django的命令行界面中这样运行:

from app.models import Page

for page in Page.objects.all()[:1]:
    page.correct_image_url()

另外,当我尝试运行

self.image.url = corrected_url

时,它返回了

AttributeError: 不能设置属性

1 个回答

0

你在做一些不太寻常的事情。图片链接中的域名应该来自于 MEDIA_URL,而不应该直接存储在 ImageField 的路径里。image.url 是由 MEDIA_URL 和图片的相对路径组合而成的。如果你想改变 MEDIA_URL,你应该定义一个类似环境变量的东西。

ImageField.url 是从 FileField 类继承来的一个函数。它的值不能被更新,因为它并不存储在数据库里,而是实时计算出来的。

如果你把域名和协议存储在 ImageField 的属性里,那就是在违反 Django 的设计理念,功能也被错误使用了。

撰写回答