为了账号安全,请及时绑定邮箱和手机立即绑定

Django FileField,在运行时确定upload_to

/ 猿问

Django FileField,在运行时确定upload_to

慕姐4208626 2019-08-15 16:11:29

Django FileField,在运行时确定upload_to

我正在尝试设置我的上传,以便如果用户joe上传文件,则转到MEDIA_ROOT / joe,而不是让每个人的文件都转到MEDIA_ROOT。问题是我不知道如何在模型中定义它。以下是目前的情况:

class Content(models.Model):
    name = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    file = models.FileField(upload_to='.')

所以我想要的不是'。' 作为upload_to,让它成为用户的名字。

据我所知,从Django 1.0开始,您可以定义自己的函数来处理upload_to,但该函数不知道用户是谁,所以我有点迷失。

谢谢您的帮助!


查看完整描述

3 回答

?
慕姐829404

你可能已经阅读了文档,所以这里有一个简单的例子让它有意义:

def content_file_name(instance, filename):
    return '/'.join(['content', instance.user.username, filename])class Content(models.Model):
    name = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    file = models.FileField(upload_to=content_file_name)

正如您所看到的,您甚至不需要使用给定的文件名 - 如果您愿意,您也可以在upload_to中调用它。


查看完整回答
反对 回复 2019-08-15
?
沧海一幻觉

这确实有帮助。为了更简洁一点,我决定在我的情况下使用lambda:

file = models.FileField(
    upload_to=lambda instance, filename: '/'.join(['mymodel', str(instance.pk), filename]),)


查看完整回答
反对 回复 2019-08-15
?
jeck猫

关于使用'instance'对象的pk值的注释。根据文件:

在大多数情况下,此对象尚未保存到数据库,因此如果它使用默认的AutoField,则它可能还没有其主键字段的值。

因此,使用pk的有效性取决于您的特定模型的定义方式。


查看完整回答
反对 回复 2019-08-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信