Django ORM 中 ImageField 的默认图像

Posted

技术标签:

【中文标题】Django ORM 中 ImageField 的默认图像【英文标题】:Default image for ImageField in Django's ORM 【发布时间】:2010-11-19 14:22:12 【问题描述】:

我正在使用ImageField 在我的模型上存储个人资料图片。

如果没有定义图像,如何设置它以返回默认图像?

【问题讨论】:

【参考方案1】:

我还没有尝试过,但我比较确定你可以在你的领域中将它设置为默认值。

pic = models.ImageField(upload_to='blah', default='path/to/my/default/image.jpg')

编辑:愚蠢的 *** 不允许我评论其他人的答案,但旧的 sn-p 不是你想要的。我强烈推荐django-imagekit,因为它可以非常轻松、干净地完成大量出色的图像大小调整和操作。

【讨论】:

感谢您提供的链接 - 看来我以后会经常使用该链接。 @ericflo:是的,*** 不允许你在声望达到 50 之前发表评论,这有点烦人。 实际上这确实有效。虽然可能并不理想......它的行为更像是“初始”而不是“默认”,因为它在创建时将其设置为默认值,但如果您删除图像,它不会将该值设置回您的默认值。因此,您可能希望在某个地方将该默认值设置为常量,并在删除时手动将其重新设置。【参考方案2】:

在models.py中

image = models.ImageField(upload_to='profile_pic', default='default.jpg')

在 settings.py 中添加:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

现在, 手动将名称为“默认”的图像添加到媒体文件夹中。

【讨论】:

试过了,但什么也没发生。 urlpatterns = [...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 添加到项目的 config/urls.py【参考方案3】:

理论上,您也可以在模型定义中使用函数。但我不知道这是否是好的做法:

class Image(model.Models):
    image = ....

    def getImage(self):
        if not self.image:
            # depending on your template
            return default_path or default_image_object

然后在模板中

   <img src="img.getImage" />

这为您未来提供了很大的灵活性...

我正在使用 sorl 生成缩略图并取得了巨大成功

【讨论】:

Django 已经为此提供了 url() 方法: 是的,但这无法提供默认网址。您可以创建一个自定义 ImageField 类,如果图像值为 None,则返回默认 url。【参考方案4】:

在您的图像字段中

field = models.ImageField(upload_to='xyz',default='default.jpg')

注意:路径应在 MEDIA_ROOT 内。

【讨论】:

【参考方案5】:

你可以在你的模板中试试这个:

% ifequal object.image None %
    <img src="DEFAULT_IMAGE" />
% else %
    display image
% endifequal %

【讨论】:

% if obj.image %display% else %% endif % -- 烧掉所有 % ifequal % 标签!!跨度> 如果您在所有视图中都需要它,您可以使用包含,您可以将其命名为 show_obj_image.html 然后使用 % include "show_obj_image.html" %【参考方案6】:

您可以使用“默认”参数提供初始值。 如果已经有一个图像并且您想将其设置为默认值(而不是删除它),您可以尝试这样的操作:

DEFAULT = 'img/default.jpg'

class Example(models.Model):
    image = models.ImageField(default=DEFAULT)

    def set_image_to_default(self):
        self.image.delete(save=False)  # delete old image file
        self.image = DEFAULT
        self.save()

如果您更喜欢默认设置,则可以使用set_image_to_default() 代替image.delete()

【讨论】:

以上是关于Django ORM 中 ImageField 的默认图像的主要内容,如果未能解决你的问题,请参考以下文章

django imagefield 如何去除clear

来自 Django 中 ImageField 的图像不会加载到模板中

ImageField() 不在 ModelForm 中保存图像 - Django/Python

Django中ImageField的使用

DAY20-Django之FileField与ImageField

python Django:单元测试中的ImageField