Django - 在保存模型时从变量获取路径

时间:2017-06-21 08:12:34

标签: python django

我的应用程序有一个简单的过程,用户上传一个gif文件然后将gif传送到保存为对象的帧。对于我的gif的upload_to部分,我运行了一个使用 uuid 创建文件夹路径的函数content_file_name()。我希望图像帧保存到与gif相同的文件夹中。问题是,我不能像我尝试的那样将路径设置为变量。需要首先定义变量,但是如果我定义它,无论我做什么,它都不会改变。这就是我现在所拥有的:

currentFilePath = '' # Defining the variable 

def content_file_name(instance, filename):
    ext = ''.join(filename.split())[:-4]
    foldername = "%s/%s" % (uuid.uuid4(), ext)
    store_random_path('/'.join(['documents', str(foldername)])) # Running a function to change the variable
    return '/'.join(['documents', str(foldername), filename])

def store_random_path(path):
    currentFilePath = str(path) # The variable should be changed here

class Document(models.Model):
docfile = models.ImageField(upload_to=content_file_name)
def create_documentfiles(self):
    gif = Image.open(self.docfile.path)
    frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]
    basename, _ext = os.path.splitext(self.docfile.name)
    for index, frame in enumerate(frames):
        buffer = BytesIO()
        frame.convert('RGB').save(fp=buffer, format='JPEG')
        destname = "{}{}.png".format(basename, index)
        finalImage = InMemoryUploadedFile(buffer, None, destname, 'image/jpeg', frame.tell, None)
        imageToSave = DocumentImage(imagefile=finalImage)
        imageToSave.save()

class DocumentImage(models.Model):
    imagefile = models.ImageField(upload_to=currentFilePath) # Trying to save using the variable as path
    image = models.ForeignKey(Document, related_name='Image', null=True, on_delete=models.CASCADE)

因此,当DocumentImage被保存时,它应该已经将变量视为路径,但它并没有。相反,它只是保存到最初声明的''这是我的媒体文件的根目录。不确定我在Python / Django中尝试的是否可行。我一个月前刚刚开始学习Python。谢谢你的时间。

2 个答案:

答案 0 :(得分:0)

但你所做的就是在store_random_path内设置一个局部变量。您甚至没有返回该变量,更不用说改变了具有相同名称的全局变量。

但是你必须使用像这样的全局变量。这将导致严重的错误,因为任何未来的请求都将获得全局变量的相同值。不要这样做。

我不确定你为什么要首先设置这个变量。您可以访问Document,其中包含正确设置其路径的docfile。您应该使用它来计算帧的路径。

答案 1 :(得分:0)

您正在分配函数内的全局变量。您需要使用imageView.layer.cornerRadius = imageView.frame.size.width/2; imageView.clipsToBounds = YES; imageView.layer.cornerRadius = 6; 关键字,或者您可以将代码重构为不使用任何全局变量(请参阅Why are global variables evil?。这不是Django特有的。

错误的方式

global

此处global_var = '' def function(): global_var = 'hello' # Local variable created due to assignment 仍为global_var

正确的方式

''

此处global_var = '' def function(): global global_var global_var = "hello" # Assignment to the global variable global_var