使用callable作为Django的FilePathField的路径属性?

时间:2018-07-05 17:31:32

标签: django python-3.x django-models django-model-field

我有以下模型,其中包括用户上传的文件。

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的动态方式。

我已经根据this link尝试了以下方法:

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代码以尝试看看他们在那儿是如何做到的,但我无法理解。

0 个答案:

没有答案