如何从Django模型的ImageField的图像目录中选择随机图像?

时间:2019-01-05 09:14:49

标签: django

我无法从随机图像目录中选择随机图像。

def random_img():
    dir_path = os.path.join(BASE_DIR, 'media')
    files = [content for content in listdir(
        dir_path) if isfile(path_join(dir_path, content))]
 return str(choice(files))

我将此功能用于:

profile_pic = models.ImageField(
        default=random_img(), upload_to="profile_images/") 

但这在迁移过程中出现了问题

1 个答案:

答案 0 :(得分:0)

如果您希望默认图像是 random ,那么您应该传递一个callable,因为否则,您会急切地 evaluate 函数,结果就是默认值。例如:

from django.db import models
from os import listdir
import os.path
from os.path import isfile
from os.path import join as path_join
from random import choice

def random_img():
    dir_path = os.path.join(BASE_DIR, 'media')
    files = [
        content for content in listdir(dir_path)
        if isfile(path_join(dir_path, content))
    ]
    return choice(files)

class SomeModel(models.Model):
    profile_pic = models.ImageField(default=random_img, upload_to="profile_images/")

所以我们不给random_img添加括号,我们不调用函数,我们传递函数本身,让Django在以下情况调用它:它需要选择一个默认值。

random_img的结果应该是相对于MEDIA_ROOT的文件路径(这里看起来是正确的,尽管如果更改设置,它可能会失败)。