Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何覆盖模型的保存方法以更改文件字段名?_Python_Django_Django Models_Django Forms - Fatal编程技术网

Python 如何覆盖模型的保存方法以更改文件字段名?

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

我的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



 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
直接获取姓名的原因。