如何在Django中建立DRY图片库

时间:2018-12-13 23:46:10

标签: python django

几天来我一直在为我的项目修改一个小型图片库,但就项目的这一部分而言,到目前为止,我觉得我并没有以非常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主意,显然同样欢迎您。

非常感谢您的阅读。

1 个答案:

答案 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()