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 的情况下从用户上传图像的问题