gpt4 book ai didi

python - 如何在 Django 中构建 DRY 图像库

转载 作者:行者123 更新时间:2023-12-01 08:34:54 24 4
gpt4 key购买 nike

几天来我一直在为我的项目修改一个小图片库,但我觉得到目前为止,就项目的这一部分而言,我并没有以非常Pythonic的方式进行处理。

在修补过程中出现了很多问题,作为 python 和 django 的新手,我无法立即了解应该如何改进代码中我想要改进的内容。

这是用户配置文件模型;我想你一定会明白我的意思:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from PIL import Image, ImageOps
from ckeditor_uploader.fields import RichTextUploadingField

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
email_visible = models.BooleanField(null=True)
activation_key = models.CharField(max_length=120, blank=True, null=True)
name = models.CharField(max_length=30, blank=True, null=True)
surname = models.CharField(max_length=30, blank=True, null=True)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
slogan = models.CharField(max_length=250, blank=True, null=True)
bio = RichTextUploadingField(
external_plugin_resources=[(
'youtube',
'/static/ckeditor/ckeditor/plugins/youtube/',
'plugin.js'
)],
blank=True,
null=True,
)
phone = models.CharField(max_length=20, blank=True, null=True)
reddit = models.CharField(max_length=30, blank=True, null=True)
facebook = models.CharField(max_length=30, blank=True, null=True)
twitter = models.CharField(max_length=30, blank=True, null=True)
youtube = models.CharField(max_length=30, blank=True, null=True)
linkdin = models.CharField(max_length=30, blank=True, null=True)

img_1 = models.ImageField(default='default.jpg', upload_to='images')
img_2 = models.ImageField(default='default.jpg', upload_to='images')
img_3 = models.ImageField(default='default.jpg', upload_to='images')
img_4 = models.ImageField(default='default.jpg', upload_to='images')
img_5 = models.ImageField(default='default.jpg', upload_to='images')
img_6 = models.ImageField(default='default.jpg', upload_to='images')
img_7 = models.ImageField(default='default.jpg', upload_to='images')
img_8 = models.ImageField(default='default.jpg', upload_to='images')
img_9 = models.ImageField(default='default.jpg', upload_to='images')

def __str__(self):
# return 'kartofler'
return self.user.username
# return f'{self.user.username} profile'

def save(self, force_insert=False, force_update=False, using=None):
super().save()
# this part needs expansion.
img = Image.open(self.image.path)
if img.width > 300 or img.height > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)

#EXPERIMENT: THUMBNAIL MACHINE
img_1 = Image.open(self.img_1.path)
xpad = int(img_1.width/2)-45
ypad = int(img_1.height/2)-45
coords = (xpad, ypad, xpad+90, ypad+90)
crop_img = img_1.crop(coords)
crop_img.save(self.img_1.path) # should save to a (colored) thumbnail folder in stead.
crop_img = ImageOps.grayscale(crop_img)
crop_img.save(self.img_1.path) # should save to a (b/w) thumbnail folder in stead.

首先,底部的 9 个图像字段显然存在一些问题。这不是 DRY,而且鉴于上述 9 个字段,我在 def save() 的下半部分尝试做的事情让我觉得有问题,因为我觉得我正在创建一个相当丑陋的怪物。我想迭代这些图像字段,而不是重复自己或类似的事情。

连接到该模型的 forms.py 文件同样是“WET”。显示所有内容的模板显然在其方式上同样是多余的。

此外,我对如何在媒体文件夹中创建(和删除)子文件夹感到困惑。我尝试用模板变量和原始字符串做一个厚颜无耻的字符串,但无济于事。如果我可以根据用户名(也许还有时间戳)创建某种层次结构,那就太好了。

基本上我是在问路。如果您碰巧知道一些我可以阅读(或观看,无论是哪一个)的好资源,我将不胜感激。如果您有一个绝妙的想法,这显然同样受欢迎。

感谢您的阅读。

最佳答案

您应该为用户照片创建另一个模型。

import datetime
def upload_file(instance, filename):
# you can add datetime
now = datetime.datetime.now()
# image/users/{username}/{now}/{filename}
return os.path.join('users/%s/' % instance.profile.user.username, now, filename)

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
email_visible = models.BooleanField(null=True)
activation_key = models.CharField(max_length=120, blank=True, null=True)
name = models.CharField(max_length=30, blank=True, null=True)
surname = models.CharField(max_length=30, blank=True, null=True)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
slogan = models.CharField(max_length=250, blank=True, null=True)
bio = RichTextUploadingField(
external_plugin_resources=[(
'youtube',
'/static/ckeditor/ckeditor/plugins/youtube/',
'plugin.js'
)],
blank=True,
null=True,
)
phone = models.CharField(max_length=20, blank=True, null=True)
reddit = models.CharField(max_length=30, blank=True, null=True)
facebook = models.CharField(max_length=30, blank=True, null=True)
twitter = models.CharField(max_length=30, blank=True, null=True)
youtube = models.CharField(max_length=30, blank=True, null=True)
linkdin = models.CharField(max_length=30, blank=True, null=True)

class Profile_Photo(models.Model):
profile = models.ForeignKey("Profile", related_name="photos", on_delete=models.CASCADE)
photo = models.ImageField(upload_to=upload_file)

#You can access user photos like this
# user = request.user
# profile = Profile.objects.get(user=user)
# photos = profile.photos.all()

关于python - 如何在 Django 中构建 DRY 图像库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53771675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com