Django图像字段默认静态文件

时间:2017-12-08 23:15:41

标签: django

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

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

如果您使用此:

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

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

2 个答案:

答案 0 :(得分:4)

首先,看看这两条路径:

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

现在,如果您的默认路径为绝对,则Django不会将网址转换为/media/.../。 Django只转换相对路径

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

额外:

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

>>> 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'

答案 1 :(得分:0)

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

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