几天来我一直在为我的项目修改一个小型图片库,但就项目的这一部分而言,到目前为止,我觉得我并没有以非常Python的方式进行处理。 / p>
在修补过程中出现了很多问题,可惜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个图像区域显然有些变化。考虑到前面提到的9个字段,这不是DRY,而且我在def save()的下半部分试图做的事情使我感到有问题,因为我正在创建一个相当丑陋的怪物。我想遍历这些图像域,而不是重复自己或类似的事情。
连接到该模型的forms.py文件同样是“ WET”。显示所有内容的模板显然在方法上同样是多余的。
我也对如何在媒体文件夹中创建(和删除)子文件夹感到困惑。我试图用模板变量和原始字符串来制作一个厚脸皮的字符串,但无济于事。 如果我可以根据用户名(或时间戳记)创建某种层次结构,那就太好了。
基本上,我在问路。如果您碰巧知道一些我可以阅读(或观看,没关系的资源)的好资源,我将非常有义务。如果您有一个杀手idea主意,显然同样欢迎您。
非常感谢您的阅读。
答案 0 :(得分:1)
您应该为用户照片创建另一个模型。
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()