【问题标题】:Django image field default static fileDjango图像字段默认静态文件
【发布时间】:2018-05-23 05:43:27
【问题描述】:

我想知道是否有办法使用静态图像文件作为 ImageField 的默认值?

我问这个是因为如果你写这样的东西,因为首先,我无法将媒体文件夹上传到我的 github 存储库,因为我将用户上传的内容存储在其中,并且默认文件始终是相同的,所以我想从静态提供默认值,但用户从媒体目录上传。

如果你使用这个:

image = models.ImageField(upload_to=/upload/folder/, default=/img/default.jpg, blank=True, null=True)

它将尝试从媒体目录加载默认图像。

【问题讨论】:

  • 在您的图像字段为空的情况下从模板提供默认图像文件。不适合你?

标签: django


【解决方案1】:

更新:这个答案不再有效。从 1.9 版开始,Django 从文件路径中删除前导 / 以将其转换为相对路径,然后将 /media/ 附加到路径中。

此更改是由于此票证:https://code.djangoproject.com/ticket/25905

替代方案:我喜欢this answer 作为替代方案。


原答案:

首先看一下这两条路径:

/img/default.jpg    -   Absolute Path (starts with slash)
img/default.jpg     -   Relative Path (doesn't start with slash)

现在,如果您的默认路径是 absolute,那么 Django 不会将 url 转换为 /media/.../。 Django 只转换相对路径

因此,如果您想从 static 文件夹中提供默认文件,您可以设置文件的绝对路径,例如 - /static/img/default.jpg


额外:

您甚至可以验证这一点。 Django 使用 urllib.parse.urljoin 创建 URL。试试这个:

>>> media_url = '/media/'
>>> abs_url   = '/img/default.jpg' # absolute url
>>> rel_url   = 'img/default.jpg'  # relative url

>>> from urllib.parse import urljoin # in Python 2: from urlparse import urljoin

>>> urljoin(media_url, abs_url) # test with absolute url
'/img/default.jpg'
>>> urljoin(media_url, rel_url) # test with relative url
'/media/img/default.jpg'

【讨论】:

    【解决方案2】:

    您可以将指向默认图像的方法定义为;

    def upload_place_pics(instance, filename):
        return "place_pics/{user}/{filename}".format(user=instance.user, filename=filename)
    def default_place_pics():
        return "place_pics/default_pic.jpg"
    
    class Place(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)
        name = models.CharField(max_length=300)
        image = models.ImageField(default=default_place_pics, upload_to=upload_place_pics, null=True)
    

    有关如何配置静态文件的更多详细信息,请参阅documentation

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 2021-03-30
      • 2015-11-16
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      相关资源
      最近更新 更多