Как добавлять картинки в Django к статьям?

Здравствуйте.
Когда я добавляю через админу django статью на сайт, мне также надо добавить к ней картинку. Как это сделать? И как сделать, чтобы она появлялась на страницу со статьёй. На сколько я знаю используют для этого ImageField, но там не всё так просто.
Не могли бы привести пример, как это реализовать или скинуть ссылку на урок?

Понимаю, сейчас многие будут рекомендовать мне поискать в гугле, но всё-таки полной инструкции я там не нашёл, везде только частями объясняется.
Заранее спасибо!
  • Вопрос задан
  • 28369 просмотров
Решения вопроса 1
sim3x
@sim3x
Если использовать только одну картинку
- добавить поле для картинки в модель
- добавить плейсхолдер картинки в темплейт

# models.py
class Article(models.Model):
     title = models.CharField(max_length=255)
     content = models.TextField()
     img = models.ImageField(upload_to='/article', 
                      height_field=100, width_field=100)


Для простоты размещаем код, который ты, в дальнейшем, перенесешь в views.py из urls.py!
https://docs.djangoproject.com/en/dev/topics/class...
#urls.py
    url(r'^article/(?P<pk>[0-9]+)/$', DetailView.as_view(
context_object_name="article",
model=Article,
template_name="article.html"
), name='article-detail'),


#article.html
<h1>{{ article.title }}
<img src="{{ article.img.url }}">
<content>{{ article.context }}


Если интересует rich editor

https://pypi.python.org/pypi/django-summernote

https://github.com/summernote/django-summernote
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@deliro
django-ckeditor
02dbbc1c96c242aebd130f0738b59d81.png

Если нужен ImageField:
class YourModel(Model):
    # ...
    image = ImageField(upload_to='images/', null=True, blank=True)

Параметр upload_to является обязательным и принимает строку или функцию. Изображения будут складываться в папку media/upload_to, где upload_to - то, что вы указали в параметре upload_to. Функция (если строка вас не устраивает) будет вызвана и в неё передадутся два аргумента - instance и filename - экземпляр модели и имя файла. Вернуть вы должны путь до файла вместе с файлом (например: images/hello/world/some_file.jpg). Например, я использовал такую:
def generate_path(instance, filename):
    ext = filename.rsplit('.', 1)[-1]
    h = md5(instance.user.username.encode()).hexdigest()
    result = 'photos/%s/%s/%s.%s' % (h[:2], h[2:4], h[4:], ext)
    path = os.path.join(settings.MEDIA_ROOT, result)
    if os.path.exists(path):
        os.remove(path)
    return result

Такая иерархия нужна, чтобы в одной папке не накапливалось много файлов, иначе система может работать долго.

Updated
Обязательно укажите MEDIA_ROOT и MEDIA_URL в настройках. Допустим, так:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы