Python 如何覆盖模型的保存方法以更改文件字段名?
我的django应用程序中有一个ModelForm,允许用户上传文件并将其存储到aws存储s3。我想做的是将文件从原始名称重命名为字段名Python 如何覆盖模型的保存方法以更改文件字段名?,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我的django应用程序中有一个ModelForm,允许用户上传文件并将其存储到aws存储s3。我想做的是将文件从原始名称重命名为字段名timestamp。到目前为止,我尝试的是覆盖模型的save方法。这是我的密码: models.py from converter.storage_backends import CsvStorage from django.db import models from django.utils import timezone import time
timestamp
。到目前为止,我尝试的是覆盖模型的save方法。这是我的密码:
models.py
from converter.storage_backends import CsvStorage
from django.db import models
from django.utils import timezone
import time
class CSVUpload(models.Model):
csv_file = models.FileField(storage=CsvStorage())
timestamp = models.CharField(max_length=1000, default= time.time())
def __str__(self):
return self.csv_file
def save(self, *args, **kwargs):
self.csv_file.name = self.timestamp + ".csv"
super(CSVUpload, self).save(*args, **kwargs)
forms.py
from django import forms
from .models import CSVUpload
import time
class CsvForm(forms.ModelForm):
csv_file = forms.FileField(widget=forms.FileInput(
attrs= {
'class': 'form-group',
}
))
timestamp = forms.CharField(initial = time.time())
class Meta:
model = CSVUpload
fields = ('csv_file', 'timestamp',)
def save(self):
csvfile = super(CsvForm, self).save()
return csvfile
我的看法是:
def uploadcsv(request):
if request.method == 'POST':
form = CsvForm(request.POST, request.FILES)
if form.is_valid():
return redirect(about)
else:
form = CsvForm()
return render(request, 'myapp/uploadcsv.html',{'form': form})
编辑
存储_backends.py
from storages.backends.s3boto3 import S3Boto3Storage
from django.conf import settings
class CsvStorage(S3Boto3Storage):
location = settings.AWS_CSV_LOCATION
file_overwrite = False
尽管如此,当我上传文件时,它并没有到达桶上。我不确定哪里出了问题,但我怀疑这取决于save方法。有人能帮我理解如何解决这个问题吗?感谢您的帮助Django为
FileField
提供了一个内置参数,它接受一个函数,您可以在其中指定对象的文件名。该参数名为upload\u to
,您可以从中找到详细信息。Django's支持使用以下命令指定上载文件名:
(……)
upload\u to
也可以是可调用的,例如函数。这将是
调用以获取上载路径,包括文件名。这
callable必须接受两个参数并返回Unix样式的路径(带
正向斜杠)传递到存储系统。(……)
因此,我们可以通过以下方式实现这一点:
class CSVUpload(models.Model):
def get_csv_name(self, filename):
return '{}.csv'.format(self.timestamp)
csv_file = models.FileField(upload_to=get_csv_name, storage=CsvStorage())
timestamp = models.CharField(max_length=1000, default= time.time())
def __str__(self):
return self.csv_file
CSVUpload类(models.Model):
def get_csv_名称(自身,文件名):
返回{}.csv.格式(self.timestamp)
csv\u file=models.FileField(上传到=get\u csv\u名称,存储=CsvStorage())
timestamp=models.CharField(最大长度=1000,默认值=time.time())
定义(自我):
返回self.csv_文件
嘿,谢谢你的回答!这不会将文件上载到带有时间戳名称的s3存储桶,事实上它仍然不会将文件上载到s3存储桶all@alordlord:您的csv存储是什么?@alord:如果您想将其上传到s3存储桶,您需要使用s3存储:在hwo上指定存储桶:嘿,我更新了我的问题!在我尝试重命名文件之前,上传到bucket是有效的。在此之后,将不会上载文件anymore@alordlord:by您不应重命名该文件。据我所知,存储无法处理重命名,因为它不是存储
接口()的一部分。这就是为什么您需要使用upload\u to
直接获取姓名的原因。