Django переименование загруженного файла: добавление определенной строки в конце

  • Я ограничиваю кнопку загрузки, чтобы разрешить только файлы csv.
  • Мне нужна помощь, чтобы добавить _hello в конце каждого файла, загруженного пользователем, но перед расширением. (например, имя_файла_пользователя.csv автоматически становится имя_файла_пользователя_hello.csv)
  • .
  • Опционально: Я бы хотел, чтобы исходный файл сначала автоматически переименовывался, а затем сохранялся в моем каталоге uploads.
  • .

models.py

from django.db import models

# validation method to check if file is csv
from django.core.exceptions import ValidationError
def validate_file_extension(value):
    if not value.name.endswith('.csv'):
        raise ValidationError(u'Only CSV files allowed.')

# Create your models here.

class user_file(models.Model):
    user_file_csv = models.FileField(upload_to='documents/user_files/', validators=[validate_file_extension])

forms.py

from django import forms
from .models import user_file
from django.forms import FileInput

class user_file_form(forms.ModelForm):
    class Meta:
        model = user_file
        widgets = {'user_file_csv': FileInput(attrs={'accept': 'text/csv'})}
        fields = ('user_file_csv',)

Спасибо!

Возможно, вам нужно что-то вроде этого:

class FileUploadUtil:

    @staticmethod
    def my_files_path(instance, filename):
        name, file_extention = os.path.splitext(filename)
        name = 'prefix-{}-{}-sufix.{}'.format(name, instance.id, file_extention)
        return "my_files/{}".format(name)


class MyModel(models.Model):
    # Other fields
    # ...
    my_file = models.FileField(max_length=300, upload_to=FileUploadUtil.my_files_path)

Дополнительно: Я хотел бы, чтобы исходный файл сначала был автоматически переименован, а затем сохранен в моем каталоге uploads.

Вы можете переопределить метод save(). Проверьте здесь Джанго документ

Возможно, вам нужен декоратор.

from pathlib import Path


def rename_helper(path: str, append_text: str):
    stem, suffix = Path(path).stem, Path(path).suffix
    return f"{stem}{append_text}{suffix}"


def rename_previous_image(func):
    """ return wrapper object """
       
        
    def wrapper(*args, **kwargs):
        
        self = args[0]
        model = type(self)
        previous_obj = model.objects.filter(pk=self.pk)
        if previous_obj.exists():
            old_name_with_path = Path(str(previous_obj[0].user_file_csv))
            Path.rename(old_name_with_path , rename_helper(path=old_name_with_path , append_text="_hello"))
        return func(*args, **kwargs)

    return wrapper


И, Вы можете украсить метод сохранения модели save().


class MyModel(models.Model):
    # Other fields
    # ...
    my_file = models.FileField(max_length=300, upload_to=FileUploadUtil.my_files_path)

    @rename_previous_image
    def save(self, **kwargs):
        super(user_file, self).save(**kwargs)  # You must add This row.

кроме того,
рекомендуем переименовать ваш класс user_file

like UserFile

Проверьте это PEP 8

Желаю хорошего дня.

Вернуться на верх