Django 应用程序:必须将图像上传到的目录名称,应自动填充

Posted

技术标签:

【中文标题】Django 应用程序:必须将图像上传到的目录名称,应自动填充【英文标题】:Django application: the directory_name to which an image has to be uploaded, should be auto populated 【发布时间】:2020-11-23 21:05:16 【问题描述】:

我想使用我的应用程序将图像上传到 django 服务器,并且必须使用我的模型共享的外键关系自动填充图像必须上传到的文件夹/目录名称

我的模型类如下,

class Event(models.Model):
    event_name = models.CharField(max_length=200)
    event_desc = models.CharField(max_length=5000)

    def __str__(self):
        return self.event_name
class Image(models.Model):
    event_id = models.ForeignKey(Event, on_delete=models.CASCADE)
    image_name = models.CharField(max_length=200)
    image = models.ImageField(upload_to='events/'.format("something"))

    def __str__(self):
        return self.image_name

models.ImageField 函数中的something 必须动态替换为event_name,并且event_name 的值应动态填充。

【问题讨论】:

【参考方案1】:

您可以将可调用对象传递给upload_to=… parameter [Django-doc]:,其中包含对模型对象的引用,因此您可以将其重新定义为:

class Image(models.Model):
    def upload_image_to(instance, filename):
        return f'events/instance.event_id.event_name/filename'
    
    event_id = models.ForeignKey(Event, on_delete=models.CASCADE)
    image_name = models.CharField(max_length=200)
    image = models.ImageField(upload_to=upload_image_to)

    def __str__(self):
        return self.image_name

您也可以更改文件名,您可以将upload_image_to 函数重写为:

def upload_image_to(instance, filename):
    ext = filename.rsplit('.', 1)[-1]
    return f'events/instance.event_id.event_name/instance.image_name.ext'

这里我们因此从右到左拆分,只保留最后一部分作为扩展。


注意:通常不会在 ForeignKey 字段中添加后缀 _id,因为 Django 将自动添加一个带有_id 后缀的“孪生”字段。因此应该 是scene,而不是scene_id

【讨论】:

非常感谢!它有效,但需要进行更多修改才能在上传后使用图像名称作为图像的名称。 python def upload_image_to(instance, filename): return f'events/instance.event_id.event_name/filename.replace(filename.split(".")[0], instance.image_name)' @GauthamKolluru:是的,我想我在你评论的那一刻就看到了 :) @GauthamKolluru:您也许可以使用rsplit 来处理包含点的文件名,例如foo.bar.jpg

以上是关于Django 应用程序:必须将图像上传到的目录名称,应自动填充的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 和 Django:如何使用 HTTP 请求(Multipart-form)上传图像?

将图像上传到目录并将图像名称写入数据库

Django 将文件上传到取决于 POST URI 的特定目录

在没有 django ModelForm 的情况下从用户上传图像的问题

在上传到 Firebase 存储之前,您是不是必须知道图像文件类型?

如何使用 post 请求异步将图像上传到 url?