Как переопределить метод сохранения модели, чтобы изменить имя файла? - PullRequest
1 голос
/ 05 июля 2019

В моем приложении django есть ModelForm, которая позволяет пользователю загружать файл и сохранять его в хранилище aws s3.Что я хочу сделать, это переименовать файл с его первоначальным именем на имя поля timestamp.То, что я пробовал до сих пор, это переопределение метода сохранения модели.Вот мой код:

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})

РЕДАКТИРОВАТЬ

storage_backends.py

  from storages.backends.s3boto3 import S3Boto3Storage 
  from django.conf import settings

  class CsvStorage(S3Boto3Storage):
     location = settings.AWS_CSV_LOCATION    
     file_overwrite = False

Несмотря на это, когда я загружаю файл, он не попадает в корзину.Я не уверен, что не так, но я подозреваю, что это лежит на методе сохранения.Может ли кто-нибудь помочь мне понять, как решить эту проблему?Я ценю любую помощь

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Django имеет встроенный параметр для FileField, который принимает функцию, в которой вы указываете имя файла вашего объекта. Параметр называется upload_to, подробности можно найти здесь .

0 голосов
/ 05 июля 2019

Django's FileField [Django-doc] поддерживает указание имени файла для загрузки с параметром upload_to [Django-doc] :

(..)

upload_to также может вызываться, например, функцией.Это будет вызвано для получения пути загрузки, включая имя файла.Этот вызываемый объект должен принимать два аргумента и возвращать путь в стиле Unix (с косой чертой) для передачи в систему хранения.(..)

Таким образом, мы можем реализовать это с помощью:

class CSVUpload(models.Model):

    def <b>get_csv_name</b>(self, filename):
        return '{}.csv'.format(self.timestamp)

    csv_file = models.FileField(<b>upload_to=get_csv_name</b>, storage=CsvStorage())
    timestamp = models.CharField(max_length=1000, default= time.time())

    def __str__(self):
        return self.csv_file
...