Загрузка изображений Django CKEditor не отображается

это дубликат Django CKEditor браузер изображений не находит изображения, но я считаю, что ответ неправильный (в нем есть очевидная ошибка с неопределенной переменной, не говоря уже об отсутствии отступа Python).

Я использую Django CKEditor 5.0.3 и Django 1.9.6. Я могу загружать изображения в своем администраторе, но они отображаются как красный X внутри администратора и не отображаются на моем сайте.

Я все еще борюсь немного с MEDIA_ROOT и что-то не так, но я думаю, что я прав:

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

MEDIA_URL = "image_upload/"
MEDIA_ROOT = os.path.join(BASE_DIR, "image_upload")

CKEDITOR_UPLOAD_PATH = 'uploads/'
CKEDITOR_IMAGE_BACKEND = "pillow"
CKEDITOR_UPLOAD_SLUGIFY_FILENAME = False

мой urls.py, включая мою попытку очистки связанного ответа:

from django.conf import settings
from django.conf.urls import url, include
from django.conf.urls.static import static
from django.contrib import admin
from mainsite.views import HomepageView, AboutView, ContactView
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns = [
    url(r'^admin/', admin.site.urls, name="admin"),
    url(r'^$', HomepageView.as_view(), name="homepage"),
    url(r'^about/', AboutView.as_view(), name="about"),
    url(r'^contact/', ContactView.as_view(), name="contact"),
    url(r'^blog/', include("blog.urls", namespace="blog")),
    url(r'^ckeditor/', include('ckeditor_uploader.urls')),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

if settings.DEBUG:
    urlpatterns += [
        url(r'^media/(?P<path>.*)$',
            'django.views.static.serve', {
                'document_root': settings.MEDIA_ROOT,
            }
        ),
    ]

urlpatterns += staticfiles_urlpatterns()

2 ответов


используя CKEDITOR_UPLOAD_PATH = 'uploads/' делает django-ckeditor для загрузки изображения в /media/uploads/, например:

settings.py:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static/'),
]
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
CKEDITOR_UPLOAD_PATH = 'uploads/'

при использовании dev-сервера Django статические файлы обслуживаются по умолчанию, но не медиафайлы, поэтому вы можете заставить сервер рассмотреть их, конфигурация url ниже должна работать.

urls.py:

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.views.static import serve
from .views import HomeView

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', HomeView.as_view(), name='home'),
    url(r'^ckeditor/', include('ckeditor_uploader.urls')),

# serving media files only on debug mode
if settings.DEBUG:
    urlpatterns += [
        url(r'^media/(?P<path>.*)$', serve, {
            'document_root': settings.MEDIA_ROOT
        }),
    ]

отсутствует функция patterns С пример была старая функция I считаю, что используется на Django 1.6 или 1.7.


используя Django 1.8 с django-ckeditor 5.3.0, я получал те же симптомы, что и выше (загрузка файлов работала, но на <img> тег был установлен неправильно, вызывая красный "X"в предварительном просмотре и сломанные ссылки на изображения при публикации).

в моем случае, однако, мне не пришлось ничего менять в urls.py. Моя проблема заключалась в том, что у меня было:

CKEDITOR_UPLOAD_PATH = os.path.join(MEDIA_ROOT, "ckeditor")

так что моей ошибкой было давать CKEDITOR_UPLOAD_PATH путь, где я хотел ckeditor загрузить в (логично, нет?).

исправление было изменить строку с

CKEDITOR_UPLOAD_PATH = "ckeditor"

оглядываясь назад, я вижу, как это позволяет django-ckeditor использовать MEDIA_ROOT для загрузки и MEDIA_URL для обслуживания. Тем не менее я подумал, что кто-то должен сказать: "Не используйте полный путь при настройке CKEDITOR_UPLOAD_PATH!"

Я надеюсь, это сэкономит другим время.