我试图使用Django 2.0。我正在使用开发运行服务器'现在,所以请记住,我还没有投入生产。我熟悉两者在静态文件方面的差异。
我有一个Blog Post模型。在管理员中,我希望能够使用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文件夹和my / media文件夹位于同一目录中。这些都在我的app目录/ blog中。
有人可以在这里看到任何明显的错误,还是可以提出建议?我的问题是默认图像没有加载。默认图像IS位于正确的目录/ media / img /中。控制台警告说&#34;未找到:/media/img/default.png"。
提前致谢。任何建议都会有所帮助。
答案 0 :(得分:0)
打印媒体根帮助我解决了这个问题。谢谢Alasdair。
我认为上面的模型字段没有任何问题。
我最终使用的urls.py代码直接来自Django docs for Django 2.0处理静态文件https://docs.djangoproject.com/en/2.0/howto/static-files/。
由于在控制台中打印了我的MEDIA_ROOT,我对“设置”所做的更改已完成。我改变了斜杠的语法和方向(blog \ media)。我还在TEMPLATES选项中删除了上面显示的上下文处理器。
这对我有用:
thumbnail = models.ImageField(default='img/default.png', upload_to='img', blank=True, null=True)
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
MEDIA_ROOT = os.path.join(BASE_DIR, 'blog\media')
MEDIA_URL = '/media/'
print(MEDIA_ROOT)
<img class="card-image mr-3" src="{{ post.thumbnail.url }}" alt="Generic placeholder image">
答案 1 :(得分:0)
用于管理面板的Django ImageField
您必须在 urls.py 中定义 MEDIA_URL ,这一点很重要。 没有这个定义框架就不会授予您访问图像的权限 Setting.py
MEDIA_URL = '/uploads/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
urls.py
if settings.DEBUG: # new
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Models.py
class Product(models.Model):
title = models.CharField(max_length=150)
image=models.ImageField(blank=True,upload_to='images/')
def __str__(self):
return self.title
def image_tag(self):
return mark_safe('<img src="{}" height="50"/>'.format(self.image.url))
image_tag.short_description = 'Image'
Admin.py
class ProductAdmin(admin.ModelAdmin):
list_display = ['title','image_tag']
readonly_fields = ('image_tag',)