如何将Django的FileField保存到用户文件夹中?

3
我有一个像这样的模型。

def upload_location(instance, filename):
    return 'validate/%s/builds/%s' % (get_current_user(), filename)
class MidletPair(models.Model): jad_file = models.FileField(upload_to = upload_location) jar_file = models.FileField(upload_to = upload_location) upload_to=tempfile.gettempdir()

如何在upload_location()中获取当前用户?

顺便提一下:查找Django相关内容很令人困惑,因为网络上有很多1.0之前的内容。

3个回答

8

当前用户存储在请求对象中,除非您从其他地方传递它,否则无法在模型方法中获取 - 而在upload_to函数中也无法这样做。

因此,您需要以不同的方式来解决这个问题 - 我建议在表单级别上处理。您可以将请求对象传递到表单的 __init__ 方法中,并将其存储在实例属性中,在其中可以访问自定义上传处理程序。有关上传处理程序的文档,请查看此处


干杯,我刚刚把这个搞定了...也许还需要更多的文档 - 我不得不深入研究Django源代码(它相当易读),但由于我仍然是一个Django新手,这有点吓人。一旦我解决了我的djangosnippets账户问题,我就会把它上传到那里,同时这是我制作的自定义类的链接: http://pastebin.com/f114b9d29 - Stuart Axon
好的,这个还没有完全工作(表单没有验证)- 最后我扩展了TemporaryFileUploadHandler来将文件复制到正确的位置(在file_complete中)。我仍然不确定为什么这么难找到相关信息。 - Stuart Axon
我只完成了部分工作,但自定义上传处理程序在调用.save后将文件保存到了错误的位置... 我想我需要更多地了解Django——目前我已经放弃了这个问题,因为我在这上面花费了很长时间却没有取得太多进展。 - Stuart Axon

5

如果您向模型添加了一个用户字段,并在执行上传之前设置了该属性,则可以通过实例属性将用户传递到upload_location函数中。


4

1
第一点是好的(我在做这个时确实遇到了麻烦)。然而,一旦你尝试做一些Django文档中没有涉及的事情,就只能深入代码去做了。 - Stuart Axon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接