【发布时间】:2018-10-03 07:58:23
【问题描述】:
我有一个模型可以接收多个 pdf 文件。当用户上传这些文件时,我希望每个文件都用前缀和一些随机字符重命名。我可以将 upload_to 分配给可调用的函数,例如:
class Order(models.Model):
invoice_file = models.FileField(upload_to=invoice_file_name)
purchase_order_file = models.FileField( upload_to=po_file_name)
payment_file = models.FileField( upload_to=payment_file_name)
def invoice_file_name(instance, file_name):
return 'inv_' + str(uuid.uuid4()) + '.pdf'
def po_file_name(instance, file_name):
return 'po_' + str(uuid.uuid4()) + '.pdf'
def payment_file_name(instance, file_name):
return 'pmt_' + str(uuid.uuid4()) + '.pdf'
有没有办法概括这些 upload_to 函数,以便我可以在 FileField 定义中传递前缀?
尝试:
我试图通过创建一个扩展 FileField 的自定义文件字段来解决这个问题
class CustomFileField(models.FileField):
def __init__(self, file_prefix, **kwargs):
self.file_prefix = file_prefix
# print(kwargs)
super().__init__(upload_to=self.custom_upload_to, **kwargs)
def custom_upload_to(self, file_name):
return self.file_prefix + str(uuid.uuid4()) + '.pdf'
class Order(models.Model):
invoice_file = CustomFileField(file_prefix='inv_')
purchase_order_file = CustomFileField(file_prefix='po_')
payment_file = CustomFileField(file_prefix='pmt_')
但是,迁移失败。其中一个错误是
TypeError: __init__() got multiple values for keyword argument 'upload_to'
不太清楚发生了什么,但我查看了迁移文件,它似乎在调用这个:
migrations.CreateModel(
name='Order',
fields=[
('invoice_file', CustomFileField(blank=True, null=True, upload_to='')
...
])
这是对 FileField 进行子类化的错误方式吗?
【问题讨论】:
标签: django django-models