如何创建一个名为字段的 upload_to 文件夹,该文件夹属于同时创建的模型?
How can I create an upload_to folder that is named a field belonging to the model that is simultaneously being created?
上下文: 我正在使用 Django 3.1.4 构建一个汽车经销商应用程序,并尝试实现一项功能,每次创建新广告时, /media/ 中的新文件夹(通过 upload_to 方法)将仅包含新创建的广告的照片。
我已经使用日期格式(见下文)使这个工作有所改善,但我需要将这个新文件夹命名为属于模型的字段之一(见第二个代码片段)。
photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
例如,每个新创建的广告都会使用标题字段..
class Vehicles(models.Model):
CONDITION_CHOICES = [("Brand New","Brand New"),("Used", "Used")]
FUEL_CHOICES = [("Petrol","Petrol"),("Diesel", "Diesel"),("Electric", "Electric"),("Hybrid", "Hybrid")]
TRANSMISSION_CHOICES = [("Automatic","Automatic"),("Manual", "Manual")]
title = models.CharField(max_length=200, default = "Ad Title & Folder Name")
def folder_name(self, title):
return self.title
make = models.CharField(max_length=100)
理想情况下,媒体文件夹应该类似于
/media/
Opel Astra VXR/
Mercedes E200/
我知道很多其他人也做过类似的事情,但我发现的所有示例都使用 'user' 而我需要使用模型字段(属于正在创建的模型)作为文件夹名称.
结束语:
第二个代码片段中的函数只是我正在试用的东西。
此外,这仍在开发中,因此在生产中我完全打算将所有媒体定向到一个 S3 存储桶。
upload_to may also be a callable, such as a function. This will be
called to obtain the upload path, including the filename. This
callable must accept two arguments and return a Unix-style path (with
forward slashes) to be passed along to the storage system. The two
arguments are:
- 实例(定义文件字段的模型实例。)
- 文件名(原先给文件的文件名)
For example:
def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
return 'user_{0}/{1}'.format(instance.user.id, filename)
找到了解决方案并想 post 为下一个可能需要它的人提供。原来是我的格式化语法问题。这起到了作用,现在为每个广告及其照片打开一个新文件夹。它还使用添加到现有广告的任何新照片更新原始文件夹。
下面的标题和功能:
title = models.CharField(max_length=200, default = "Ad Title & Folder Name")
def upload_photo_to(self, filename):
return f'{self.title}/{filename}'
照片字段及其应用方式:
photo_1 = models.ImageField(upload_to=upload_photo_to, blank=True)
上下文: 我正在使用 Django 3.1.4 构建一个汽车经销商应用程序,并尝试实现一项功能,每次创建新广告时, /media/ 中的新文件夹(通过 upload_to 方法)将仅包含新创建的广告的照片。
我已经使用日期格式(见下文)使这个工作有所改善,但我需要将这个新文件夹命名为属于模型的字段之一(见第二个代码片段)。
photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)
例如,每个新创建的广告都会使用标题字段..
class Vehicles(models.Model):
CONDITION_CHOICES = [("Brand New","Brand New"),("Used", "Used")]
FUEL_CHOICES = [("Petrol","Petrol"),("Diesel", "Diesel"),("Electric", "Electric"),("Hybrid", "Hybrid")]
TRANSMISSION_CHOICES = [("Automatic","Automatic"),("Manual", "Manual")]
title = models.CharField(max_length=200, default = "Ad Title & Folder Name")
def folder_name(self, title):
return self.title
make = models.CharField(max_length=100)
理想情况下,媒体文件夹应该类似于
/media/
Opel Astra VXR/
Mercedes E200/
我知道很多其他人也做过类似的事情,但我发现的所有示例都使用 'user' 而我需要使用模型字段(属于正在创建的模型)作为文件夹名称.
结束语: 第二个代码片段中的函数只是我正在试用的东西。
此外,这仍在开发中,因此在生产中我完全打算将所有媒体定向到一个 S3 存储桶。
upload_to may also be a callable, such as a function. This will be called to obtain the upload path, including the filename. This callable must accept two arguments and return a Unix-style path (with forward slashes) to be passed along to the storage system. The two arguments are:
- 实例(定义文件字段的模型实例。)
- 文件名(原先给文件的文件名)
For example:
def user_directory_path(instance, filename): # file will be uploaded to MEDIA_ROOT/user_<id>/<filename> return 'user_{0}/{1}'.format(instance.user.id, filename)
找到了解决方案并想 post 为下一个可能需要它的人提供。原来是我的格式化语法问题。这起到了作用,现在为每个广告及其照片打开一个新文件夹。它还使用添加到现有广告的任何新照片更新原始文件夹。
下面的标题和功能:
title = models.CharField(max_length=200, default = "Ad Title & Folder Name")
def upload_photo_to(self, filename):
return f'{self.title}/{filename}'
照片字段及其应用方式:
photo_1 = models.ImageField(upload_to=upload_photo_to, blank=True)