Модель Джанго с динамическими атрибутами - PullRequest
2 голосов
/ 18 октября 2011

Я полностью, совершенно новичок в программировании, поэтому, пожалуйста, прости, что, вероятно, глупый вопрос, но я бился над этим в течение последних нескольких дней.

У меня есть две модели: фотографии и миниатюры. Я пытаюсь придумать простой, динамичный способ получить ссылки на миниатюры для каждой фотографии. Я придумала функцию, которая делает это (get_thumbs), но я бы хотела, чтобы она запускалась автоматически при вызове модели (в основном, чтобы я получала Photo.get_% s_url% thumb.name, как только модель станет доступна) .

Ниже приведен мой models.py. Любая помощь или толчок в правильном направлении (даже если это просто "Google Blah") будет принята с благодарностью. Спасибо.

class Photo(models.Model):
    name = models.CharField(max_length=100)
    original_image = models.ImageField(upload_to='photos')
    caption = models.TextField(null=True, blank=True)
    title_slug = models.SlugField(null=True, blank=True, unique=True)
    rootfilename = models.CharField(max_length=50, editable=False, blank=True)
    num_views = models.PositiveIntegerField(editable=False, default=0)

    def __unicode__(self):
        return self.name

    thumbnails = Thumbnail.objects.all()

    def create_thumbs(self):
        for thumbnail in self.thumbnails:
            fname = (settings.MEDIA_ROOT + self.rootfilename + '_' + thumbnail.name + '.jpg')
            if exists(fname):
                None
            else:
                t_img = Image.open(self.original_image.path)
                t_fit = ImageOps.fit(t_img, (thumbnail.height,thumbnail.width), Image.ANTIALIAS, 0, (0.5,0.5))
                t_fit.save(fname,"JPEG")

    def save(self, *args, **kwargs):
        self.rootfilename = (self.original_image.name).strip('photos/.jpg')
        super(Photo, self).save(*args, **kwargs)
        self.create_thumbs()

    def get_thumbs(self):
        for thumb in self.thumbnails:
            setattr(self, ('get_'+thumb.name+'_url'), ('thumbs/'+self.rootfilename+'_'+thumb.name+'.jpg'))

1 Ответ

1 голос
/ 18 октября 2011

Вы хотите переопределить метод __init__, как вы это сделали с методом save, и вызвать self.get_thumbs() перед вызовом super (Photo, self). init (* args, ** kwargs)

С другой стороны, вы можете посмотреть на решение этой проблемы других людей: sorl.thumbnail, django-imagekit или easy-thumbnails (что-то вроде сочетания двух)

...