Django - ImageField,在开发服务器中上传、存储和提供图像

3
我希望在我的模型的管理表单中添加一个ImageField(例如,用于个人资料),并且稍后在视图中显示此图像。
这是我拥有的模型:
class Individual(models.Model):
    ind_name = models.CharField(max_length=100)
    ind_photo = models.ImageField(default="default.jpg")

    def __str__(self):
        return self.ind_name

这是我网站设置中的内容:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")
MEDIA_URL = '/static/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,"static/media")

这些是我的应用程序的网址:

urlpatterns = [
    url(r'^$', views.index, name="index")
]

我知道如何使用静态文件(例如CSS、Javascript),并使它们在开发和生产中工作。但是我不知道如何让图片工作。我已经阅读了管理静态文件部署静态文件,但我仍然不明白。
使用上面的代码,图像将保存在正确的文件夹中(即我的站点级别的/static/media)。但是我不知道:
1)如何在模板中显示它,
2)是否最好将这些图像保留在我的应用程序的静态文件夹中,
3)以及(如果是2)是否需要每次有人在管理员中上传图像时运行collectstatic。
抱歉如果我表达不清楚,但这比我想象中的更难懂。
2个回答

4
为了在开发中上传和提供图像,我不得不将媒体文件夹从静态文件夹中移出(即在项目文件夹的根目录下创建一个媒体文件夹)。
在我的主urls.py中,我必须添加:
from django.conf import settings
from django.conf.urls.static import static

if settings.DEBUG: 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

正如MicroPyramid建议的那样。

为了在模板中显示它,对于给定的个人“somebody”(来自查询集),我使用:

<img src="{{ somebody.ind_photo.url }}">

0

将静态文件和媒体文件分开是一个好的实践。如果您将图像存储在静态文件夹中,则每次上传时都必须执行collectstatic操作。我们可以从对象中获取图像的完整URL,如下所示。

{{obj.ind_photo.url}}

有关文件的更多信息https://docs.djangoproject.com/en/1.10/topics/files/


我无法在开发服务器上显示此图像。URL路径正确,但未提供服务。另外,如果我需要在管理员上传图像时每次运行collectstatic,我应该在哪里挂钩?在我的模型的保存方法中吗? - GuitarExtended
一般情况下,在开发/生产环境中,我们将使用Web服务器提供静态或媒体文件。因此,您必须在Web服务器中配置媒体目录的路径。 - MicroPyramid
我认为我可以在生产环境中让它正常工作,但是我需要在开发过程中测试一些东西。那么在运行开发服务器时如何提供图像服务呢? - GuitarExtended
我已经在我的应用程序和网站的urls.py中尝试过这个,但它仍然无法提供图像。 :( - GuitarExtended
哦,这很奇怪,你能给出MEDIA_URL和MEDIA_ROOT以及路径的结果吗? - MicroPyramid
显示剩余2条评论

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