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