Используя вызываемый как атрибут пути FilePathField Джанго?

У меня есть следующая модель, которая включает в себя загрузку файла пользователем.

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)

Однако, глядя на документацию по FilePathField в Django 3.0, не похоже, что для атрибута 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 ответов

Другие вопросы по тегам