Почему моя директория загрузки является относительной к директории проекта, а 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 не был распознан при запросе формы!

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