2011-12-23 5 views
0

사용자 업로드 파일에 사용자 이름과 파일 이름을 기반으로하는 경로가 지정된 시스템을 설정하려고합니다. this question에 대한 대답은 올바른 방향으로 나에게 지적한 것처럼 보이지만보기에서 구현에 약간 문제가 있습니다.파일을 사용자 정의 파일 경로에 업로드하는 방법

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에 있어야한다고 생각하지만 이것은 빈 dict로 표시됩니다.

본질적으로 나는이 모델을 통해 새 문서를 추가 할 때 관리자의 동작을 복제하기 위해 무엇을해야 하는지를 알고 싶습니다.

+0

어떤 형태를 사용하지 않으면 다음 당신은 당신의 모델에 대한 양식을 만드는 시도 할 수 있습니다 ? 'document = Document.objects.create (...)'를 사용한다면'document.save()'는 필요 없습니다. https://docs.djangoproject.com/en/dev/topics/db/queries/# 객체 생성 –

답변

1

<form> 태그에 enctype="multipart/form-data" 세트가 있습니까? request.FILES이 비어있는 경우 동적 경로 생성에 문제가 없습니다 (아직까지 도달하지 못했습니다).

+0

잘 어리 석다. 어쨌든 더 넓은 관점으로, 그렇습니다. 저는 폼 모델을 사용해야 만합니다. 그러나 더 이상 난독 화하기 전에 작동하도록하고 싶었습니다. –

0

먼저 @jknupp가 지적한 것처럼 enctype="multipart/form-data"을 반드시 사용하십시오.

보기 업데이트

from models import Document 
from django.forms import ModelForm 

class DocumentForm(ModelForm): 

    class Meta: 
     model = Document 

forms.py :

views.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 
    ... 
관련 문제