Django ORM中ImageField的默认图像

51

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

如果没有定义图片,我该如何设置它返回默认图片?

6个回答

54

我没有尝试过这个方法,但我相对确定你可以把它设置为你的字段的默认值。

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

编辑:愚蠢的StackOverflow不允许我评论别人的答案,但那个旧片段不是你想要的。我强烈推荐django-imagekit,因为它可以非常轻松和干净地进行大量图像缩放和操作。


谢谢你提供的链接 - 看起来我将来会经常使用它。 - Yuvi
@ericflo:是的,StackOverflow在您获得50个声望之前不允许您留下评论,这有点烦人。 - Powerlord
6
实际上这是有效的,虽然可能不是理想的... 它更像是“初始值”而不是“默认值”,因为它在创建时将其设置为默认值,但如果您删除图像,则不会将该值设置回您的默认值。因此,您可能希望在某个地方建立该默认值作为一个常量,并在删除时手动将其设置回去。 - John Mee

19

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

现在,手动将名为"default"的图像添加到媒体文件夹中。


1
尝试了这个,但是没有任何反应。 - AnonymousUser
urlpatterns = [...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 添加到您的项目的 config/urls.py 文件中。 - Alexander P

11

理论上您也可以在模型定义中使用一个函数。但是我不知道这是否是良好的实践:

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进行缩略图生成。


2
Django已经为此提供了url()方法: <img src="{{my_image.url}}"> - shanyu
3
没错,但这样做无法提供默认的URL。你可以创建一个自定义的ImageField类,在图像值为None时返回一个默认的URL。 - Jordan Reiter

7
在您的图像字段中
field = models.ImageField(upload_to='xyz',default='default.jpg')

注意:路径应该在MEDIA_ROOT内。

3
您可以在您的模板中尝试以下方法:
{% ifequal object.image None %}
    <img src="DEFAULT_IMAGE" />
{% else %}
    display image
{% endifequal %}

14
{% if obj.image %}显示{% else %}<img src="默认" />{% endif %} -- 烧掉所有{% ifequal %}标签!! - SmileyChris
1
如果您需要在所有视图中使用它,可以使用include,您可以将其命名为show_obj_image.html,然后使用{% include "show_obj_image.html" %}。 - imjoevasquez

0

您可以使用“default”参数提供初始值。 如果已经有一张图片并且您想将其设置为默认值(而不是删除它),您可以尝试类似于以下内容的操作:

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()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接