我希望将文件上传到动态分配的目录,具体取决于从MySQL数据库检索的用户。uploads_to函数根据文档只接受两个参数,所以我假设不能注入另一个变量来完成返回的路径字符串?代码片段如下:
models.py
def item_uploads_to(instance, filename, userName):
return '/home/' + userName would go here + '/path/to/uploads/' + filename
class Document2(models.Model):
docfile2 = models.FileField(upload_to=item_uploads_to)views.py
userName = 'python' # this is a test value, working DB query code goes here
item_uploads_to(instance, filename, userName) 发布于 2013-06-24 10:59:13
你不能马上就做,因为你不能传递额外的参数。但是您可以将用户添加到要保存的实例中,这样您就可以通过执行instance.user.username甚至instance.username来获得它。
在您的创建代码中,您将得到如下内容:
doc = Document2(random stuff but no docfile2)
doc.username = userName
doc.docfile2 = theFile
doc.save()发布于 2022-06-23 06:44:47
对于我的puprose,我使用类和一些方法来调用,对于各种参数使用__init__方法,例如:
class UploadTo:
def __init__(self, folder = None):
self.folder = folder
def save_path(self, instance, filename):
return f"/path/to/{folder}/{filename}"使用:
class Document2(models.Model):
docfile2 = models.FileField(upload_to=UploadTo(folder=userName).save_path注意:每次运行makemigrations时,这种方法都会生成新的迁移。它不会改变任何东西,但会创建新的迁移文件。就我而言,我以不同的方式处理这件事,取决于具体情况。
另一种方法是在模型本身内定义属性或方法,然后从instance获取它。
class Document2(models.Model):
docfile2 = models.FileField(upload_to=item_uploads_to)
@property
def user_name(self):
return userName然后,这个值可以从函数中得到:
def item_uploads_to(instance, filename):
return '/home/' + instance.user_name + '/path/to/uploads/' + filenamehttps://stackoverflow.com/questions/17273740
复制相似问题