Django ImageField在模板中显示绝对的Linux路径

时间:2017-05-29 05:09:31

标签: python django

我有以下型号

class Product(SiteBaseFields):
    name = models.CharField(max_length=500)
    description = models.CharField(max_length=500)
    price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, default=0.00)
    unit = models.CharField(max_length=500, null=True, blank=True, default=0.00)
    image = models.ImageField(upload_to=settings.MEDIA_ROOT, null=True, blank=True)

    def __unicode__(self):
        return self.name

数据库中的产品记录

d762ugo5f5706v=> select id, image from dj_commerce_product
d762ugo5f5706v-> ;
 id |                                                image
----+------------------------------------------------------------------------------------------------------
 17 | /var/www/dj_node_project/media/iphone_4TTsU22.jpg
 19 | /var/www/dj_node_project/media/samsung_phone_5VlDULp.png
 18 | /var/www/dj_node_project/media/201409-w-americas-best-coffee-cities-new-orleans-cafe-du-_CTcGKwx.jpg
(3 rows)

当我在模板中执行<img src="{{MEDIA_URL}}{{product.image.url}}" />时,我会返回<img src="/var/www/dj_node_project/media/iphone_4TTsU22.jpg">,并且图片的网址完全错误。我不能不找出原因。

1 个答案:

答案 0 :(得分:1)

更改settings.py中的MEDIA_URL和MEDIA_ROOT。

# settings.py 
MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR , "media") # this is the root/absolute path for uploaded files

重新上载一些内容并检查这是否正常。该问题与MEDIA_URL或MEDIA_ROOT有关。常见的初学者错误地将MEDIA设置配置错误。

供参考:

https://docs.djangoproject.com/en/1.11/ref/settings/#media-root https://docs.djangoproject.com/en/1.11/ref/settings/#media-url

修改

  

FileField.upload_to此属性提供了一种设置方法   上传目录和文件名,可以通过两种方式设置。同时   case,将值传递给Storage.save()方法。

     

如果指定字符串值,则可能包含strftime()格式,   这将被文件上传的日期/时间所取代(这样   上传的文件没有填满给定的目录)。例如:

class MyModel(models.Model):
    # file will be uploaded to MEDIA_ROOT/uploads
    upload = models.ImageField(upload_to='uploads/')
    # or...
    # file will be saved to MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')