【发布时间】:2018-01-03 13:03:33
【问题描述】:
我正在尝试为每个用户创建一个文件夹来放置他们的项目。因此他们的文件将具有路径 ..\project\id\filename,id 是用户 id 和 filename 是文件的名称。现在在Filefield 中使用upload_to 允许的参数(instance 和filename),我意识到instance.id 将是None,文件的路径将是..\project\None\filename 而不是@987654333 @。
现在正在阅读Django documentation upload_to 我看到了这个:
在大多数情况下,这个对象不会被保存到数据库中 然而,所以如果它使用默认的 AutoField,它可能还没有 其主键字段的值。
我的解释是创建新记录和user_directory_path不会同时实例化,也就是说,当我在Project模型上调用create时,instance.id将是None。我现在的问题是,有没有办法解决这个问题?虽然我看到upload_to 很方便,但对于我正在做的动态路径来说,它不一定很方便。我正在考虑创建记录,然后在更新中添加文件路径,但我正在寻找一种可以一步保存所有内容的方法。
models.py
def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
return 'project/{0}/{1}'.format(instance.user.id, filename)
class Project(models.Model):
email = models.ForeignKey(User,
to_field="email",
max_length=50
)
title = models.CharField(max_length=100)
date_created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
file = models.FileField(upload_to=user_directory_path, validators=[validate_file_type], null=True)
当表单通过验证时,这是views.py。注意 user_directory_path 在 create 之前被调用。
email = request.user.email
title = request.POST.get('title', '')
file = request.FILES['file']
filename = file.name
instance = Usermie.objects.get(email=request.user.email)
# Save to model
user_directory_path(instance=instance, filename=filename)
Project.objects.create(
title=title, file=file,
)
【问题讨论】:
标签: python django django-models django-file-upload