Как правильно обслуживать медиа файлы в поддоменах django (используя django-hosts) в разработке?
У меня есть эта модель Blog и я использую ее в поддомене 'blog', созданном с помощью 'django-hosts'.
Мои поддомены в 'hosts.py':
from django.conf import settings
from django_hosts import patterns, host
host_patterns = patterns('',
host(r'blog', 'blog.urls', name='blog'),
host(r'(|www)', settings.ROOT_URLCONF, name='www'),
)
И модель блога - Обратите внимание, что поле 'title_image' работает с 'sorl.thumbnail', а поле 'content' является загружаемым полем 'django-ckeditor':
class Blog(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL,
verbose_name=_('author'),
on_delete=models.CASCADE,
related_name='blog_author')
title = models.CharField(verbose_name=_('title'), max_length=200)
title_image = ImageField(verbose_name=_('title image'), blank=True)
content = RichTextUploadingField(verbose_name=_('content'))
Я создал простой ListView для блога, который показывает название каждого блога, содержание и title_image зрителю:
class BlogListView(ListView):
"""Everyone can see all blogs"""
template_name = 'blog/templates/blog/blog_list_view.html'
model = Blog
context_object_name = 'blogs'
И мои blog.urls:
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.BlogListView.as_view(), name='blog_list_view'),
]
Когда я использую поддомен моего блога (например: blog.localhost:8000/) он не показывает мне никакого изображения будь то title_image или любое изображение в поле 'content' в django-ckeditor powered. Но когда я не использую поддомен и вместо этого использую приложение 'blog' в качестве другого пути 'URLCONF' (например: localhost:8000/blog/) я могу видеть все изображения без проблем. Кто-нибудь знает, почему при использовании поддоменов медиа файлы не отображаются и как это исправить?
Я понял это.
Вам нужно загрузить папку MEDIA в urls.py, на которую указывает ваш hosts.
Так в вашем blog.urls
from django.urls import path
from django.conf import settings
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.BlogListView.as_view(), name='blog_list_view'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
прежде всего в settings.py
MEDIA_DIR = BASE_DIR / 'media'
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'
then in main project urls.py
from django.conf.urls import url
from django.views.static import serve
from django.conf import settings
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}),
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root = settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
и я бы уродливо использовал в ваших моделях это
title_image = models.ImageField(upload_to='title_images', blank=True)
если вы используете приложение локально, то оно работает нормально, если проблема возникает на производстве, то используйте cloudinary