root@bred-09:~/codes/my_sites/Majoris# sudo apt install python3-pillow
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Заметьте, вместо «python3-pillow» выбирается «python3-pil»
Следующий пакет устанавливался автоматически и больше не требуется:
libllvm4.0
Для его удаления используйте «sudo apt autoremove».
Будут установлены следующие дополнительные пакеты:
libwebpmux1
Предлагаемые пакеты:
python-pil-doc python3-pil-dbg
Следующие НОВЫЕ пакеты будут установлены:
libwebpmux1 python3-pil
Обновлено 0 пакетов, установлено 2 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 327 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 1 381 kB.
Хотите продолжить? [Д/н] y
Пол:1 http://ru.archive.ubuntu.com/ubuntu xenial/main amd64 libwebpmux1 amd64 0.4.4-1 [14,2 kB]
Пол:2 http://ru.archive.ubuntu.com/ubuntu xenial-updates/main amd64 python3-pil amd64 3.1.2-0ubuntu1.1 [313 kB]
Получено 327 kB за 0с (1 007 kB/s)
Выбор ранее не выбранного пакета libwebpmux1:amd64.
(Чтение базы данных … на данный момент установлено 210936 файлов и каталогов.)
Подготовка к распаковке …/libwebpmux1_0.4.4-1_amd64.deb …
Распаковывается libwebpmux1:amd64 (0.4.4-1) …
Выбор ранее не выбранного пакета python3-pil:amd64.
Подготовка к распаковке …/python3-pil_3.1.2-0ubuntu1.1_amd64.deb …
Распаковывается python3-pil:amd64 (3.1.2-0ubuntu1.1) …
Обрабатываются триггеры для libc-bin (2.23-0ubuntu11) …
Настраивается пакет libwebpmux1:amd64 (0.4.4-1) …
Настраивается пакет python3-pil:amd64 (3.1.2-0ubuntu1.1) …
Обрабатываются триггеры для libc-bin (2.23-0ubuntu11) …
root@bred-09:~/codes/my_sites/Majoris# python3.7 manage.py runserver
Performing system checks...
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7f9d9f230598>
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/django/utils/autoreload.py", line 225, in wrapper
fn(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run
self.check(display_num_errors=True)
File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 425, in check
raise SystemCheckError(msg)
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:
ERRORS:
main.Post.image: (fields.E210) Cannot use ImageField because Pillow is not installed.
HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".
System check identified 1 issue (0 silenced).
from django.db import models
from django.shortcuts import reverse
from django.utils.text import slugify
from time import time
def gen_slug(s):
new_slug = slugify(s, allow_unicode=True)
return new_slug + '-' + str(int(time()))
class Post(models.Model):
title = models.CharField(max_length=150, db_index=True)
slug = models.SlugField(max_length=150, blank=True, unique=True)
body = models.TextField(blank=True, db_index=True)
tags = models.ManyToManyField('Tag', blank=True, related_name='posts')
date_pub = models.DateTimeField(blank=True, null=True)
def get_absolute_url(self):
return reverse('post_url', kwargs={'slug': self.slug})
def get_update_url(self):
return reverse('post_update_url', kwargs={'slug': self.slug})
def get_delete_url(self):
return reverse('post_delete_url', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
if not self.id:
self.slug = gen_slug(self.title)
super().save(*args, **kwargs)
def __str__(self):
return self.title
class Tag(models.Model):
title = models.CharField(max_length=50)
slug = models.SlugField(max_length=50, unique=True)
def get_absolute_url(self):
return reverse('tag_url', kwargs={'slug': self.slug})
def get_update_url(self):
return reverse('tag_update_url', kwargs={'slug': self.slug})
def get_delete_url(self):
return reverse('tag_delete_url', kwargs={'slug': self.slug})
def __str__(self):
return self.title
class PostUpdate(ObjectCreateMixin, View):
model = Post
model_form = PostForm
template = 'blog/post_update.html'
class PostUpdate(ObjectUpdateMixin, View):
model = Post
model_form = PostForm
template = 'blog/post_update.html'
ObjectCreateMixin ---> ObjectUpdateMixin
def get(self,request, slug):
form = self.model_form()
return render(request, self.template, context={'form': form})
urls