class WEBPThumbnailImg(ImageFieldFile):
def save(self, name, content, save=True, max_width=None, max_height=None):
self.max_width = max_width
self.max_height = max_height
......
def save_form_data(self, instance, data):
if data:
data.save(data.name, data.file, save=True, max_width=self.max_width, max_height=self.max_height)
else:
super().save_form_data(instance, data)
class WEBPThumbnailImg(ImageFieldFile):
def save(self, name, content, save=True, max_width=None, max_height=None):
content.file.seek(0)
image = Image.open(content.file)
if max_width and max_height:
(w, h) = image.size
if w > max_width:
img_ratio = float(w) / max_width
new_height = int(float(h) / img_ratio)
image = image.resize((max_width, new_height), Image.LANCZOS)
if h > max_height:
img_ratio = float(h) / max_height
new_width = int(float(w) / img_ratio)
image = image.resize((new_width, max_height), Image.LANCZOS)
# Сохраняем изображение
image_bytes = io.BytesIO()
image.save(fp=image_bytes, format="WEBP")
image_content_file = ContentFile(content=image_bytes.getvalue())
super().save(name, image_content_file, save)
class WEBPThumbnail(models.ImageField):
attr_class = WEBPThumbnailImg
def __init__(self, *args, **kwargs):
self.max_width = kwargs.pop('max_width', 200)
self.max_height = kwargs.pop('max_height', 200)
super().__init__(*args, **kwargs)
def save_form_data(self, instance, data):
# Передаем параметры max_width и max_height в метод save класса WEBPThumbnailImg
if data:
data.max_width = self.max_width
data.max_height = self.max_height
super().save_form_data(instance, data)
class Category(models.Model):
name = models.CharField("Категория", max_length=100, db_index=True)
slug = models.SlugField("URL", max_length=44, unique=True, db_index=True)
thumbnail = WEBPThumbnail(
"Миниатюра",
upload_to=upload_cats_thumbnail,
blank=True,
max_width=400,
max_height=200
)
new_heigh = int(float(image.size[1]) / img_ratio)
image = image.resize((max_width, new_heigh), Image.LANCZOS)
if h > max_height вместо elif
используйте if
def pre_save(self, model_instance, add):
pre_save используется перед сохранением. Если он вам не нужен, то попробуйте без него написать логику. class WEBPThumbnail(models.ImageField):
attr_class = WEBPThumbnailImg # атрибут
def __init__(self, *args, **kwargs):
self.max_width = kwargs.pop('max_width', 200)
self.max_height = kwargs.pop('max_height', 200)
super().__init__(*args, **kwargs)
def pre_save(self, model_instance, add):
file = super().pre_save(model_instance, add)
if file and not file._committed:
file.max_width = self.max_width
file.max_height = self.max_height
return file
class Foo {
constructor() {
console.log('one');
}
static async abracadabra() {
const instance = new Foo();
await instance.init();
return instance;
}
async init() {
await this.snooze(2000);
console.log('two');
await this.snooze(2000);
console.log('three');
}
snooze(milliseconds) {
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
}
// Используем метод abracadabra
(async () => {
const bar = await Foo.abracadabra();
console.log('Initialization complete');
})();
return 22 # литерал
return x # переменная
return x + y # арифметическое выражение
return some_function(x, y) # вызов функции
return x += 1 # оператор присваивания
return x = x + 1 # оператор присваивания
def pycharm_getpass(prompt):
print(prompt, end='', flush=True) # выводим приглашение для ввода пароля
password = '' # инициализируем пустую строку для хранения пароля
while True: # начинаем бесконечный цикл
key = ord(os.read(sys.stdin.fileno(), 1)) # читаем один символ из стандартного ввода и преобразуем его в ASCII-код
if key == 13: # если символ — это Enter (ASCII-код 13)
break # выходим из цикла
if key == 127: # если символ — это Backspace (ASCII-код 127)
password = password[:-1] # удаляем последний символ из пароля
print('\b \b', end='', flush=True) # перемещаем курсор назад, удаляем символ и снова перемещаем курсор назад
else:
password += chr(key) # добавляем символ к паролю
print('*', end='', flush=True) # выводим звездочку вместо символа
print() # выводим пустую строку
return password # возвращаем собранный пароль
password=pycharm_getpass('Password: '), # считываем пароль с помощью функции pycharm_getpass, вместо капризной getpass