Как загрузить файл в пользовательский путь к файлу - PullRequest
0 голосов
/ 24 декабря 2011

Я пытаюсь настроить систему, в которой загруженным пользователем файлам будет указан путь на основе имени пользователя и имени файла. Ответ на этот вопрос , кажется, указал мне верное направление, но у меня возникли небольшие проблемы с реализацией с точки зрения.

У меня есть модель, которая использует это:

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, но это показано как пустой диктовку.

По сути, я просто хочу знать, что мне нужно сделать, чтобы повторить поведение администратора, когда я добавляю новый документ с помощью этой модели.

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

У вас есть enctype="multipart/form-data" в вашем теге <form>?Если request.FILES пусто, проблема не в вашей динамической генерации пути (она еще не дошла).

0 голосов
/ 24 декабря 2011

Во-первых, как указал @jknupp, не забудьте использовать enctype="multipart/form-data".Далее вы можете попробовать создать форму для вашей модели:

forms.py

from models import Document
from django.forms import ModelForm

class DocumentForm(ModelForm):

    class Meta:
        model = Document

Обновите свой вид:

просмотров.py

... #your imports
from forms import DocumentForm

...

def create_button(request): # create_button?
    ...
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid(): 
            form.save()
            return # redirect somewhere else
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...