首页 > 解决方案 > 无法将图像上传到 Django 管理员

问题描述

我正在从事电子商务项目,我被困在这个问题上。每当管理员添加新产品时,它还应该添加与产品相关的图像。所以我添加了带有 ImageField 的列,但我一次又一次地收到错误。这是我的模型代码

class Product(models.Model):
    product_id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100, blank=True, null=True)
    image = models.ImageField(db_column='image' , blank=True, null=True)
    info = models.CharField(max_length=500, blank=True, null=True)
    
    def image_tag(self):
        if self.image:
            return mark_safe('<img src="%s"/>' % self.image.url)
        else:
            return 'No Image Found'
    image_tag.short_description = 'Image'

并在 admin.py

class ProductAdmin(admin.ModelAdmin):
    list_display = ('product_id', 'name','image_tag', 'info')
    readonly_fields = ('image',)

admin.site.register(Product, ProductAdmin)

但每次我得到这个错误

Exception Type: AttributeError
Exception Value:'bytes' object has no attribute 'url'

我尝试使用转义但它仍然不显示图像。我正在使用 MySQL 现有数据库。我真的可以使用帮助。谢谢

标签: pythondjangodjango-modelsdjango-admin

解决方案


目前,您将图像作为字节存储在数据库中,Django 不喜欢这样,您应该首先指定MEDIA_ROOT这是保存图像的文件夹,并且只有 URL 将保存在数据库中。文档[来源]

我假设您已经MEDIA设置并安装了Pillow. 你的ImageField意志看起来像,

# No need to specify db_column as Django already stores by default field's name.
image = models.ImageField(upload_to='users/%Y/%m/%d/', blank=True, null=True)

现在在您的模板中,您可以通过以下方式获取图像,

<img src="http://127.0.0.1:8000/media/{{ profile.photo }}" id='profile-photo'>

推荐阅读