在Django Admin中上传文件时更新自定义文件路径

时间:2014-07-21 12:11:02

标签: python django

我正在使用Django管理界面在服务器上上传文件。我正在使用动态路径来保存它,这取决于网页上的其他字段。 该文件应保存到:

 *"mixes/%session_number/%day_of_play/%file_name".* 

(where %session_number, %day_of_play, and %file_name are other fields on the upload page)

所以我设法通过制作自定义delete()方法,以及如何删除新文件并将其上传到正确的路径,从管理页面删除文件后,从服务器中删除文件如果使用自定义save()方法从管理页面修改文件。但是,我还想在编辑路径名中包含的3个变量中的任何一个时移动文件,因为这样更有意义。因此,如果我在管理界面上为给定文件编辑一个字段(比如session_number),我希望它从"mixes/1/%day_of_play/%file_name" to "mixes/2/%day_of_play/%file_name"移开。但我似乎无法做出那么简单的工作。这是我的models.py:

from django.db import models
import os
import datetime

class Session(models.Model):
    sessionName = models.CharField(max_length=200)
    startTime = models.TimeField('Session Starting Time')

    def __unicode__(self):
        return self.sessionName

def get_saving_path(instance, filename):
    return os.path.join('mixes', '%s' % instance.session, '%d' % instance.airDate.year, '%d' % instance.airDate.month, '%d' % instance.airDate.day, filename)


class Mix(models.Model):
    session = models.ForeignKey(Session)
    name = models.CharField(max_length=255)
    airDate = models.DateField('Airing date')
    mix = models.FileField(upload_to=get_saving_path)  #'mixes/%Y/%m/%d')

    def __unicode__(self):
        return self.name

    def delete(self, *args, **kwargs):
        storage, path = self.mix.storage, self.mix.path
        super(Mix, self).delete(*args, **kwargs)
        storage.delete(path)

    def save(self, *args, **kwargs):
        try:
            original = Mix.objects.get(id=self.id) 
            if original.session != self.session:
                original.mix.delete(save=False)
            if original.mix != self.mix:
                original.mix.delete(save=False)
        except: pass
        super(Mix, self).save(*args, **kwargs)

所以我在上一个方法中所做的是检查我们是在编辑对象还是创建一个新对象,如果我们正在编辑,我会检查数据库字段中的内容。如果混合不同,我删除旧文件并上传新文件。但是如果更改了对象会话,我也希望这样做。它不起作用,我无法弄清楚原因。 (我在另一个stackoverflow帖子上发现了这个方法,所以我可能还没有完全理解它为什么它现在不能正常工作......)

以下是我的数据库所说的内容:

$ python manage.py dumpdata radio.Mix
[{"pk": 1, "model": "radio.mix", "fields": {"mix": "mixes/Evening/2014/7/21/Since I've Been Loving You.mp3", "session": 2, "name": "LedZep", "airDate": "2014-07-23"}}]
$ python manage.py dumpdata radio.Mix
[{"pk": 1, "model": "radio.mix", "fields": {"mix": "mixes/Morning/2014/7/1/Gallows Pole.mp3.mp3", "session": 1, "name": "LedZep", "airDate": "2014-07-01"}}]
$ python manage.py dumpdata radio.Mix
[{"pk": 1, "model": "radio.mix", "fields": {"mix": "mixes/Morning/2014/7/1/Gallows Pole.mp3.mp3", "session": 2, "name": "LedZep", "airDate": "2014-07-01"}}]

所以我上传了我填写的所有字段的第一个文件,似乎工作正常。 然后我在编辑对象时更改上传的文件,文件路径更新。我也将会话从Evening(2)更改为Morning(1),也更新了(旧文件被删除)。 最后,我再次编辑我的对象,但这次只是将会话从早上(1)改为晚上(2)。我的会话字段更新,但我的文件路径没有,我无法弄清楚原因。

我正在使用Django 1.6

0 个答案:

没有答案