Я пытаюсь настроить систему, в которой загруженным пользователем файлам будет указан путь на основе имени пользователя и имени файла. Ответ на этот вопрос , кажется, указал мне верное направление, но у меня возникли небольшие проблемы с реализацией с точки зрения.
У меня есть модель, которая использует это:
class Document(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=100, blank=False, null=False)
date = models.DateTimeField(auto_now=True)
path = models.FileField(upload_to= custom_doc_file_path) # path should be /media/users/USERNAME/DOCUMENT_NAME
и custom_doc_file_path определяется так:
def custom_doc_file_path(instance, filename):
# creates media/users/USERNAME/FILENAME
return '/'.join(['users', instance.user.username, get_directory_name(filename), filename])
def get_directory_name(filename):
directory = filename.replace('.', '_')
directory = directory.replace(' ', '_')
return directory
Это прекрасно работает при загрузке файла из представления администратора, но я не могу воспроизвести его из создаваемого представления. Мой взгляд выглядит так:
def create_button(request):
if request.method == 'POST':
document = Document.objects.create(
user = request.user,
name = request.POST['name'],
path = request.POST['uploaded_file']
)
document.save()
Но когда я пытаюсь это сделать, путь сохраняется как имя файла. Если я попытаюсь оставить путь пустым, а затем сохранить файл по этому пути, модель вообще не создаст путь. Кроме того, я думаю, что файл должен быть в request.FILES
, но это показано как пустой диктовку.
По сути, я просто хочу знать, что мне нужно сделать, чтобы повторить поведение администратора, когда я добавляю новый документ с помощью этой модели.