如何在django子域(使用django-hosts)中正确地服务媒体文件?



我有这个模型博客,并在'django-hosts'创建的' Blog '子域中使用它。

我的子域名在'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. image'驱动。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还是django-ckeditor支持的"content"字段中的任何图像。但是当我不是时使用子域名,而不是使用'blog'应用程序作为其他'URLCONF'路径(例如:localhost:8000/blog/)我可以看到所有的图像没有任何问题。有人知道为什么使用子域,媒体文件不显示和如何修复它吗?

我明白了。

你需要做的是加载你的url .py中主机指向的MEDIA文件夹。

在你的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)

first of all in settings.py

MEDIA_DIR = BASE_DIR / 'media'
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'

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)

如果你在本地使用app,那么这个工作很好,如果问题是在生产中引起的,那么使用cloudary

最新更新