目前正在开展一个小型Django电子商务项目并遇到一个小问题。作为参考,我在网上免费使用Tango和Django书。
我在模型中设置了ImageField,以便为Product模型指定产品的图像。我还有一个名为Category的模型,它使用ForeignKey引用Product模型。
图像上传到模型中的/ static / products_img文件夹,但是,当图像显示在我的模板中时,图像会链接到/ static / static / products_img文件夹。但是,当我删除模型中的/ static,然后通过管理界面上传图像时,它会将其上传到/ 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,
)
答案 0 :(得分: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
。