Как получить путь к файлу с помощью Django?

В настоящее время я использую формы Django для создания FileField, который позволяет пользователю загрузить файл. Однако после того, как я выбираю файл, создается объект типа django.core.files.uploadedfile.InMemoryUploadedFile, который является копией исходного файла.

Как мне получить исходный путь к этому файлу, чтобы я мог изменить или заменить его?

# forms.py

class UploadFile(forms.Form):
    file = forms.FileField(label="Select File: ", required=True)
# views.py

def get_path(response):
    context = {}

    if response.method == "POST":
        form = UploadFile(response.FILES)

        if form.is_valid():
            file = form.cleaned_data["file"]
            # Is there a  way to get the original file path or should I just not use FileField?
            print("The File Path Here")

функция temporary_file_path

if form.is_valid():
    file = form.cleaned_data["file"]
    print(file.temporary_file_path())

Не совсем понятно, почему вы хотите попробовать изменить путь к файлу InMemoryUploadedFile. Однако, просто помните о термине "InMemory".

Файл еще не был сохранен, поэтому перед сохранением не будет пути, связанного с файлом. Насколько мне известно ( меня поправят, если я ошибаюсь), InMemoryUploadedFile также не имеют атрибута path, но content/file, filename и т.д.; в которых имя файла может быть изменено. Вы можете посмотреть doc здесь.

При желании вы можете внести изменения в имя файла, сделав следующее:

if form.is_valid():
     form.cleaned_data["file"].name = "modify.txt"  # or to whatever filename and extension you want.
     form.save()  # If you have a save method defined
     

Однако вы можете проявить некоторую изобретательность и сохранить файл по определенному пути в папке media. Например:

# forms.py

import os
from django.conf import settings

class UploadFile(forms.Form):
     file = forms.FileField(label="Select File: ", required=True)

     # The save method that will save the file to a specific location in the media folder.
     def save(self):  
          filename = file.name
          folder = 'uploaded/'
    
          # Create the folder if it doesn't exist.
          try:
               os.mkdir(os.path.join(settings.MEDIA_ROOT, folder))
          except:
               pass

          # Save the uploaded file inside that folder.
          file_path = os.path.join(settings.MEDIA_ROOT, folder, filename)
    
          with open(file_path, 'wb+') as destination:  
               for chunk in file.chunks():
                    destination.write(chunk)

# view.py

def get_path(response):
     if response.method == "POST":
          form = UploadFile(response.FILES)

          if form.is_valid():
               file = form.cleaned_data["file"]
               # file.name = "modify.txt"  # Can modify here if necessary...
               
               form.save()

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