如何使用动态设置子目录的Django模型中设置Image Field

发布于 2025-02-12 07:10:18 字数 1090 浏览 2 评论 0原文

我需要将照片上传到特定目录。

我有以下模型代码。

@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/jenifer_argon/2019223/2022/07/01” 我可以设置“ student/” 目录,但是用户名和std_no和日期应动态设置。 student/user/std_no/date 用户和std_no应该来自创建运行时的模型。 我该怎么做?

就像;一切都将处于相同的形式。但是,将首先设置STD_NO和用户,而不是用于设置上传的DIDETORY定义,并将图像上传到该目录。

I need to upload photos to specific directories.

I have below model code.

@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"))

For the photo line. It uploads photos to student/ directory. But i need to have subdirectories with User name and dates. Like "student/jenifer_argon/2019223/2022/07/01"
I can set "student/" directory but username and std_no and date should be dynamically set. student/user/std_no/date user and std_no should come from above model on creation runtime.
How can i do this?

It is like; everything will be on same form. But std_no and user will be set first than they will be used to set upload diretory definition and image will be uploaded to that directory.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无需解释 2025-02-19 07:10:18

一个函数可以传递给 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"))
   ...

A function can be passed to upload_to that is passed the instance and filename, you can construct your path using these

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"))
   ...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文