Как установить поле 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"))
...