2014-03-24 52 views
1

目前正在开发一个小型的Django电子商务项目,并遇到一个小问题。作为参考,我使用免费在线提供的Django书籍Tango。Django - 图像显示不正确

我在我的模型中设置了一个ImageField,以便为Product的模型指定产品的图像。我还有一个名为Category的模型,它使用ForeignKey引用到产品模型。

图像上传到模型中的/ static/products_img文件夹,但是当图像显示在我的模板中时,图像链接到/ static/static/products_img文件夹。但是,当我删除模型中的/静态图像,然后通过管理界面上传图像时,会将其上载到/ products_img而不是静态文件夹,当然它显示正常。但是......它变得更加怪异,当我删除新创建的目录并将图像放置在静态文件夹中的/ product_img文件夹中时,它仍然显示!

我很困惑。

models.py 

class Product(models.Model): 
... 
    image = models.ImageField(upload_to='static/products_img', blank=True) 


template.html 
<a href="{{ product.slug }}"><img src="{{ STATIC_URL }}{{ product.image }}" alt="{{ product.name }}" /></a> 


settings.py 
... 
SETTINGS_DIR = os.path.dirname(__file__) 
PROJECT_PATH = os.path.join(SETTINGS_DIR, os.pardir) 
PROJECT_PATH = os.path.abspath(PROJECT_PATH) 
... 
STATIC_PATH = os.path.join(PROJECT_PATH,'static') 
STATIC_URL = '/static/' 
STATICFILES_DIRS = (
    STATIC_PATH, 
) 

回答

1

我认为你有静态和媒体文件之间的混淆。静态文件与您的应用程序(CSS,JS ...)捆绑在一起,而用户上传媒体文件。

据我所知,你的产品图像是媒体文件,而不是静态文件。

如果你更换模板部分:

<a href="{{ product.slug }}"><img src="{{ product.image.url }}" alt="{{ product.name }}" /></a> 

和你的模型:

image = models.ImageField(upload_to='products/img', blank=True) 

并添加相应的设置到您的settings.py:

PROJECT_PATH = os.path.abspath(os.path.dirname(__file__)) 
# with this, your media directory will be the same directory than your settings.py file 
# you can also use a standard path like "/var/www/media" 
# IMPORTANT : In any case, you have to create the directory by hand 
MEDIA_ROOT = os.path.join(PROJECT_PATH, "media") 
MEDIA_URL = "/media/" 

如果您将图片上传到产品中,则现在应将其保存在MEDIA_ROOT导演年。模板中显示的网址应为/media/projects/img/image_name

+0

映射似乎与您发布的内容一起工作,但是,替换模板部分会产生此错误:''图像'属性没有与之关联的文件。'我尝试搜索此错误但无济于事。 – user2942863

+0

对它进行排序,必须在模板中添加“{{MEDIA_URL}}”。谢谢!似乎我在压力中忽略了一些东西。 – user2942863