Django:将用户上传内容保存在单独的文件夹中

Kan*_*ane 3 python django upload models

我希望单个用户能够将其文件上传到一个文件夹中(因此每个用户都有自己的根文件夹,他们可以在其中上传自己的文件),但是我不确定实现此目标的最佳方法。

我最初计划将用户电子邮件用作他们的文件夹名称,他们所有的上载都将保存在此文件夹中。但是,据我所知,检索此信息的唯一方法是通过请求函数,而且我无法设法将请求的实例获取到models.py文件中,因此无法将其添加到我的“ upload_to”目录中。

任何其他关于如何分离用户文件或如何在模型文件中获取请求实例的想法,将不胜感激!

这是我当前的模型:

def user_directory_path(instance, filename):
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class UploadModel(models.Model):
    user = models.OneToOneField(User)
    file = models.FileField(upload_to=user_directory_path)
Run Code Online (Sandbox Code Playgroud)

和它相关的错误:

Exception Value: UploadModel has no user.
Run Code Online (Sandbox Code Playgroud)

Lou*_*iro 7

  1. 我不建议您使用用户电子邮件或任何其他可以更新为文件夹名称的信息,因为您每次更改电子邮件或用户名时都不会更改文件夹名称。因此,请使用唯一且不可更改的用户ID。

  2. 这是Django文档中的完整示例,用于访问模型中的实例信息以使用用户ID构建路径:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它将在文件夹名称中使用用户ID。当然,您可以将替换FileFieldImageField

django docs中的更多信息:FileFields.upload_to


qas*_*ali 5

您可以通过用户名分隔文件夹吗?您可以创建一个使用用户名创建文件夹的函数,如下所示:

def get_user_image_folder(instance, filename):
    return "%s/%s" %(instance.user.username, filename)
Run Code Online (Sandbox Code Playgroud)

在您的模型中,您可以轻松使用upload_to并将您刚刚创建的功能添加到其中:

class Images(models.Model):
   user = models.ForeignKey(User)
   image = models.ImageField(upload_to=get_user_image_folder,
                                  verbose_name='Image', )
Run Code Online (Sandbox Code Playgroud)

您不必request在模型中使用,instance而是使用。