【发布时间】:2018-01-16 17:52:24
【问题描述】:
我正在尝试使用 Django 2.0。我现在正在使用开发“runserver”,所以请记住我还没有投入生产。我熟悉两者在静态文件方面的区别。
我有一个博客帖子模型。在管理员中,我希望能够使用 ImageField 将图像添加到我的模型中。我希望它是可选的,如果没有添加则提供默认图像。
我可以在管理员中加载图像。我无法在我的模板中呈现我的图像。控制台显示 Django 正在尝试获取我的图像,但我的配置到目前为止还没有工作。
这是我的模型和相关领域:
from PIL import Image
class Post(models.Model):
....
thumbnail = models.ImageField(default='/img/default.png', upload_to='img', blank=True, null=True)
....
我的模型在 ImageField 之外运行良好。我的观点运作良好,我认为那里没有任何问题。
这是我的 urls.py
....
from django.conf.urls.static import static
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from . import views
urlpatterns = [
....
path('posts/', views.PostListView.as_view(), name='post_list'),
path('post/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
path('post/random/', views.random_post, name='random_post'),
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我完全不确定如何在我的 urls.py 中处理静态文件和媒体文件,尤其是在 2.0 版中对 Django 进行了更改。
这是我的相关设置。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
....
'django.contrib.messages.context_processors.media',
....
]
},
},
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
MEDIA_URL = '/media/'
我同样不确定在我的 settings.py 中添加有关媒体的内容。我的静态 CSS 文件运行良好。我的静态文件中有一个徽标图像,它在我的基本模板中呈现。
这是我的 ImageField 模板标签:
<img class="card-image mr-3" src="{{ post.thumbnail.url }}" alt="Generic placeholder image">
最后,我的 /static 文件夹和我的 /media 文件夹在同一个目录中。这些都在我的应用程序目录 /blog 中。
任何人都可以在这里看到任何明显的错误,或者他们可以提出建议吗?我的问题是默认图像未加载。默认图像位于正确的目录 /media/img/ 中。控制台警告显示“未找到:/media/img/default.png”。
提前致谢。任何建议都会有所帮助。
【问题讨论】:
-
MEDIA_ROOT的评估结果是什么?你确定你需要replace()吗?我会将默认值更改为default='img/default.png'而不使用前导斜杠。但是,我认为这两者都不是真正的问题。 -
我将在 Settings.py 中取出 replace()。我将更改前导斜杠。如何评估 MEDIA_ROOT?我复制了图片上的网址。 127.0.0.1:8000/media/img/default.png。它没有找到 /media/img/default.png 但图像在这些目录中。
-
只需将
print(MEDIA_ROOT)添加到您的设置中即可检查其值。 -
谢谢。我解决了。我在 MEDIA_ROOT 中遗漏了我的应用名称。
标签: django image imagefield filefield