Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django中基于模型名动态更改上载位置_Django - Fatal编程技术网

在Django中基于模型名动态更改上载位置

在Django中基于模型名动态更改上载位置,django,Django,我有这个模型: class Photos (models.Model): file = models.ImageField() description = models.CharField(max_length=255, blank=True) Purpose = models.CharField(default='None', max_length=10) uploaded_at = models.DateTimeField(auto_now_add=True)

我有这个模型:

class Photos (models.Model):
    file = models.ImageField()
    description = models.CharField(max_length=255, blank=True)
    Purpose = models.CharField(default='None', max_length=10)
    uploaded_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = 'photo'
        verbose_name_plural = 'photos'

    def __str__(self):
        return self.description
此模型包含上传到站点的所有照片。我还有三种其他模型可以参考它:

class Member(Models.Model):
     ...(various fields)
     Photos = models.ManytoManyForeignKey(Photos)

class Unit(models.Model):
     ...(various fields)
     Photos = models.ManytoManyForeignKey(Photos)

class avatar(models.Model):
     ...(various fields)
     Photos = models.ForeignKey(Photos)
我的问题是文件在哪里。我知道我可以在PHotos类中添加
上传到:
参数,但是有没有一种方法可以根据引用模型专门指定要转到的文件夹

例如,
当类化身被激活时上传到:'/avatars/'
?或者转到Members类的
/Member Photos/
文件夹?

您可以执行一个函数。所以基本上,你可以用

def upload_location(instance, filename):
    return os.path.join('/media/%s/' % instance.__class__.__name__, filename) 

class Photos (models.Model):
    file = models.ImageField(upload_to=upload_location)
    ...
这将动态地附加您的模型类名(例如,
avatar
成员
,等等)

编辑

如果您希望根据模型实例自定义返回的名称,我将创建一个映射这些值的
dict

path_mapping = {'avatars':'avatars','Member':'Member-Photos'}

def upload_location(instance, filename):
    try:
        path = path_mapping[instance.__class__.__name__]
    except KeyError:
        path = 'Unknown'
    return os.path.join('/media/%s/' %path , filename) 

class Photos (models.Model):
    file = models.ImageField(upload_to=upload_location)
    ...

请注意,这不是实现这一目标的唯一方法。我只是觉得它是可维护和可读的。如果在映射
dict
中没有实现自定义路径,则将使用
未知的

这太棒了。多谢!!抱歉,类型(实例)返回:。我该如何修复它?@arcee123请告诉我它现在是否适合您的需要。是的。我会处理这个。非常感谢。在
path=
行末尾的代码中有一个额外的括号(“)”),但是,我认为这会起作用。我现在的问题是,我必须重做我的表单,以确保在发送照片时实例是“成员”或“单位”。