django - не может отобразить изображение из класса PostDetailView
на главная страница, изображения отображаются правильно, но когда я открываю Post_detail, изображение не отображается.
Post_detail.html
<img class="rounded image" src="{{ post.image.url }}">
homeApp URL
from django.urls import path
from .views import *
urlpatterns = [
path('', index, name='index'),
path("post/<int:pk>/", PostDetailView.as_view(), name='post-detail')
]
Views:
class PostDetailView(DetailView):
model = Post
template_name = 'post_detail.html'
URL
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('home.urls'))
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Models
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=140, unique=True)
content = models.TextField(null=True, blank=True)
image = models.ImageField(upload_to='posts/', default='default.jpg')
def __str__(self):
return self.title
[![введите сюда описание изображения][1]][1]
Settings
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
MEDIA_URL = "static/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')
Admin
from django.contrib import admin from .models import *
from django.utils.safestring import mark_safe
admin.site.register(Post)
def image_tag(self):
return mark_safe('<img src="%s"/>' % self.image.url)
image_tag.allow_tags = True
Ответы (1 шт):
Автор решения: gisolog
→ Ссылка
model
class Post(models.Model):
title = models.CharField(max_length=140, unique=True)
content = models.TextField(null=True, blank=True)
image = models.ImageField(upload_to='posts/') # remove default
def __str__(self):
return str(self.title)
def image_tag(self):
return mark_safe('<img src="%s"/>' % self.image.url)
image_tag.allow_tags = True
admin
@admin.register(Post)
class Post_Admin(admin.ModelAdmin):
readonly_fields = ('id', 'image_tag')
fieldsets = [
(None, {
'fields': ['title', 'content', 'image',]
}),
('extra', {
'classes': ('collapse',),
'fields': ['image_tag']
}),
('Поля-для-чтения', {
'classes': ('collapse',),
'fields': ['id']
}),
]
ну, и раз DEBUG=True...что-то типа этого:
settings
if not DEBUG:
# вариант, когда статика раздается apache/nginx
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = "/static/media/"
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
else:
# вариант development'a
STATICFILES_DIRS = [r'd:\Python\card2\static']
STATIC_URL = '/static/'
MEDIA_URL = "/static/media/" # по мне, static - лучше в отдельную папку, media - тоже в отдельную, на одном уровне
и вообще, не мучайтесь c DEBUG=True - делайте сразу staging
