У меня проблема со вставкой изображений в базу данных django
вот моя модель:
from django.db import models
class Topic(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Article(models.Model):
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
title = models.CharField(max_length=6000)
featured_image = models.ImageField(null=True,blank=True, default="default.jpg")
# i want to add this filed
content = models.TextField()
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
я установил python -m pip install pillow и вот моя конфигурация настроек:
import os
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / 'static'
]
в панели администратора я ожидаю появления featured image filed, который устанавливает изображение с default.jpg
если при создании статьи админ не вставляет изображение.
После запуска python manage.py makemigrations
он всегда выдает следующее:
Невозможно изменить нулевое поле 'topic' в статье на ненулевое без указания значения по умолчанию. Это связано с тем, что базе данных нужно чем-то заполнить существующие строки.
Пожалуйста, выберите вариант исправления:
Предоставить одноразовое значение по умолчанию сейчас (будет установлено для всех существующих строк с нулевым значением этого столбца)
Пока игнорировать. Существующие строки, содержащие NULL-значения, придется обрабатывать вручную, например, с помощью операции RunPython или RunSQL.
Выйдите и вручную определите значение по умолчанию в models.py.
Выберите опцию:
Независимо от того, что я выбираю, я все равно не вижу файла в админке Django
Таким образом, STATIC_URL
и STATIC_ROOT
отличаются от MEDIA_URL
и MEDIA_ROOT
, которые вам нужно использовать для загрузки. В связи с этим приведем пример, который поможет вам начать работу.
settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media' # directory where media files will be stored.
urls.py
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# you might want to add STATIC_URL and STATIC_ROOT here also so static assets are served.
Добавляя static()
к urlpatterns
, вы разрешаете django обслуживать медиа-активы.
Обратите внимание, что это решение для локальной разработки, в производстве вы должны перегрузить его на nginx или другой сервер.
Если вам нужно "изображение по умолчанию", теперь вы можете добавить стандартный jpeg в папку media, и он будет использоваться в тех случаях, когда вы не загружаете файл.