在Django2中使用另一个字段名动态命名图像文件

在Django2中使用另一个字段名动态命名图像文件,django,django-models,Django,Django Models,我正在尝试保存一个图像文件,该文件的名称已更改为相同格式的另一个字段的名称 经过一些实验后,当对象返回到模型进行保存时,通过在模型中使用处理函数,它工作得很好。我解构file对象并可以为其指定一个我想要的名称,但是,我无法解构Charfield对象并动态地将第一个字段名传递给图像文件 from django.db import models import os #handler function to customise file name. def photo

我正在尝试保存一个图像文件,该文件的名称已更改为相同格式的另一个字段的名称

经过一些实验后,当对象返回到模型进行保存时,通过在模型中使用处理函数,它工作得很好。我解构file对象并可以为其指定一个我想要的名称,但是,我无法解构Charfield对象并动态地将第一个字段名传递给图像文件

    from django.db import models
    import os

    #handler function to customise file name.
    def photo_path(instance, filename):
        basefilename, file_extension= os.path.splitext(filename)
        return '{add}/{room}/{basename}{ext}'.format
             (add='my_Add', room="should_Be_room_type", basename= basefilename, ext= file_extension)
模型是:

    class Room(models.Model):
        room_type = models.CharField( max_length=50)  # i.e bedroom /living room etc
        room_size = models.CharField( max_length=50)
        img = models.ImageField( upload_to=photo_path, null=True, blank=True)

        def __str__(self):
            return self.room_type

在您的情况下,参数
instance
将是您的房间实例,您可以使用它来恢复
Room\u type
Room\u size
。由于在上传图像之前不会创建实例,因此,
photo\u path
上唯一不可用的东西将是
instance.id
,但您不需要它

那么,您的函数可以写成:

def photo_path(instance, filename):
        basefilename, file_extension = os.path.splitext(filename)
        return '{add}/{room}/{basename}{ext}'.format
             (add='my_Add', room=instance.room_type, basename=basefilename, ext=file_extension)

谢谢,我最终在view.py中使用

my_room_type = request.POST['room_type']
initial_obj = form.save(commit=False)
initial_obj.save()
其想法是获取为“房间类型”输入的值,并将其打印在图像上。现在可以了,谢谢