Почему моя директория загрузки является относительной к директории проекта, а Django пытается получить ее из пути, связанного с приложением?
Я создаю Dev-блог для хранения и ссылок на проекты, которые я создал для своего портфолио, и я пытался добавить возможность загрузки мультимедиа в текстовые поля моих сообщений. Я начал с использования стандартного RichTextField, который имел встроенную функцию для добавления изображений через URL (без загрузки). Это работало хорошо, но я хотел иметь возможность загружать фотографии с моей машины.
Блог полностью рабочий (на локальном сервере для разработки), поэтому весь неактуальный код был проигнорирован.
Единственная проблема заключается в установке путей к моим файлам изображений.
models.py
from django.db import models
from django.utils import timezone
from django.urls import reverse
from ckeditor_uploader.fields import RichTextUploadingField
class Post(models.Model):
author=models.ForeignKey('auth.User',on_delete=models.CASCADE)
title= models.CharField(max_length=40)
text = RichTextUploadingField()
create_date = models.DateTimeField(default=timezone.now())
publication_date = models.DateTimeField(blank=True,null=True)
def publish(self):
self.publication_date=timezone.now()
self.save()
def approve_comment(self):
return self.comments.filter(approved_comment=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post_detail', kwargs={'pk':self.pk})
def ckeditor_upload(self):
return reverse('post_detail', kwargs={'pk':self.pk})
urls.py
from django.contrib import admin
from django.urls import path,include,re_path
from django.contrib.auth import views
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('blog.urls')),
path('accounts/login/',views.LoginView.as_view(template_name='registration/login.html'),name='login'),
path('accounts/logout/',views.LogoutView.as_view(),name='logout',kwargs={'next_page':'/'}), #{'next_page':'/'} makes it go back to homepage
re_path(r'^ckeditor/', include('ckeditor_uploader.urls')),
]
**settings.py**
<pre>
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ckeditor',
'ckeditor_uploader',
'blog'
]
#
#
#
CKEDITOR_UPLOAD_PATH = 'media/uploads'
The file is being uploaded to a new media directory in the project folder, but it is trying to load it from within the app folder.
<pre>
[20/Sep/2021 02:58:14] "POST /ckeditor/upload/ HTTP/1.1" 200 86
Not Found: /media/uploads/2021/09/20/kaki.jpg
[20/Sep/2021 02:58:14] "GET /media/uploads/2021/09/20/kaki.jpg HTTP/1.1" 404 4602
Not Found: /media/uploads/2021/09/20/kaki.jpg
[20/Sep/2021 02:58:14,942] - Broken pipe from ('127.0.0.1', 54571)
Что я пробовал:
CKEDITOR_UPLOAD_PATH = 'blog/media/uploads'- Те же результаты, но внутри папки blog(app).- Перемещение файла изображения вручную в каталог apps media - изображение загрузилось, но это вроде как бессмысленно .
- Добавление корневых переменных
MEDIA_URL='/media/' MEDIA_ROOT= os.path.join(BASE_DIR,'blog/media') CKEDITOR_UPLOAD_PATH = 'uploads'
- та же ошибка[20/Sep/2021 03:34:48] "POST /ckeditor/upload/ HTTP/1.1" 200 95 Not Found: /blog/media/uploads/2021/09/20/linkdn.jpg [20/Sep/2021 03:34:48] "GET /blog/media/uploads/2021/09/20/linkdn.jpg HTTP/1.1" 404 4623 Not Found: /blog/media/uploads/2021/09/20/linkdn.jpg [20/Sep/2021 03:34:48] "GET /blog/media/uploads/2021/09/20/linkdn.jpg HTTP/1.1" 404 4623
- Попробовал посмотреть в документации
Add a CKEDITOR_UPLOAD_PATH setting to the project’s settings.py file. This setting specifies a relative path to your CKEditor media upload directory. CKEditor uses Django’s storage API. By default, Django uses the file system storage backend (it will use your MEDIA_ROOT and MEDIA_URL) and if you don’t use a different backend you have to have write permissions for the CKEDITOR_UPLOAD_PATH path within MEDIA_ROOT, i.e.: CKEDITOR_UPLOAD_PATH = "uploads/" When using default file system storage, images will be uploaded to the “uploads” folder in your MEDIA_ROOT and URLs will be created against MEDIA_URL (/media/uploads/image.jpg). If you want to be able to have control over filename generation, you have to add a custom filename generator to your settings:- Ничего не помогло.
- Попробовал загрузить в статику - получился полный беспорядок.
Наводящие вопросы:
Если
.CKEDITOR_UPLOAD_PATH- путь загрузки, могу ли я указать путь загрузки, или мне остаетсяMEDIA ROOTЕсть ли значение по умолчанию, управляющее путем загрузки?
Может быть, есть другой Rich text и upload box, который лучше подходит?
Заранее спасибо всем, кто поможет!<3
РЕШЕНО
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #Without this the MEDIA's URL is not recognized!!!
Не был добавлен к URL, поэтому URL не был распознан при запросе формы!