Как правильно обслуживать медиа файлы в поддоменах 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

Вернуться на верх