Как установить поле imagefield в модели django с динамически задаваемыми подкаталогами

Мне нужно загрузить фотографии в определенные каталоги.

У меня есть следующий код модели.

@reversion.register()
    class Student(BaseModel):
    uuid = models.UUIDField(default=uuid.uuid4, verbose_name=_("Unique Identifier"), unique=True)
    user = models.OneToOneField(User, on_delete=models.PROTECT, db_index=True, verbose_name=_("User"))
    photo = models.ImageField(upload_to="student/", null=True, blank=True, verbose_name=_("Photo"))
    std_status = models.IntegerField(choices=STD_STATUS, default=1, verbose_name=_("Stu Sta"))
    std_no = models.AutoField(primary_key=True, verbose_name=_("Stu Num"))
    name = models.CharField(max_length=100, db_index=True, verbose_name=_("Name"))
    surname = models.CharField(max_length=100, db_index=True, verbose_name=_("Surname"))

Для линии фотографий. Она загружает фотографии в каталог student/. Но мне нужно иметь подкаталоги с именем пользователя и датами. Like "student/jenifer_argon/2019223/2022/07/01" Я могу установить "student/" директорию, но имя пользователя, std_no и дата должны быть динамически установлены. student/user/std_no/date пользователь и std_no должны прийти из вышеуказанной модели во время выполнения создания. Как я могу это сделать?

Похоже, все будет на той же форме. Но сначала будут заданы std_no и user, затем они будут использованы для определения директории загрузки и изображение будет загружено в эту директорию.

В функцию upload_to можно передать экземпляр и имя файла, вы можете построить свой путь, используя эти

from datetime import date

def student_photo_path(instance, filename):
    today = date.today()
    return 'student/{0}/{1}/{2}/{3}/{4}/{5}'.format(
        instance.user.username,
        instance.std_no,
        today.year,
        today.month,
        today.day,
        filename
    )


class Student(BaseModel):
    ...
    photo = models.ImageField(upload_to=student_photo_path, null=True, blank=True, verbose_name=_("Photo"))
   ...
Вернуться на верх