我有以下模型,其中包括用户上传的文件。
def resume_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/user_<id>/resume/<filename>
return 'user_{0}/resume/{1}'.format(instance.student_user.id, filename)
class Resume(models.Model):
resume = models.FileField(upload_to=resume_path, blank=True, null=True)
pub_date = models.DateTimeField(default=timezone.now)
student_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
然后,我想允许用户在以后的表单中选择他们上传的文件之一。因此,我需要能够动态设置包含该用户文件的目录的路径,类似于我在原始模型中设置 upload_path 的动态方式。
我根据此链接尝试了以下操作:
def resume_directory_path(instance):
# returns the path: MEDIA_ROOT/user_<id>/resume/
return 'user_{0}/resume/'.format(instance.student_user.id)
class JobApplication(models.Model):
student_user = models.ForeignKey(StudentUser, on_delete = models.CASCADE)
resume = models.FilePathField(path=resume_directory_path, null=True)
但是,查看 Django 3.0 中 FilePathField 的文档,它看起来并不需要对 path 属性进行调用。所以,我不确定上述链接中的答案如何回答我的问题。实现此功能的最佳方法是什么?
我想做如下的事情:
class CallableFilePathField(models.FilePathField):
def __init__(self, *args, **kwargs):
kwargs['path'] = resume_directory_path(instance)
super().__init__(*args, **kwargs)
class JobApplication(models.Model):
student_user = models.ForeignKey(StudentUser, on_delete = models.CASCADE)
resume = models.CallableFilePathField(path=resume_directory_path, null=True)
问题是我不知道如何在这段代码中正确引用模型实例(所以实例未定义)。我查看了 FileField 代码,试图看看他们是如何在那里做的,但我无法理解它。