2011-12-23 238 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,但這是顯示爲一個空字典。

本質上我只是想知道當我通過這個模型添加一個新文檔時,我需要做什麼來複制管理員的行爲。

+0

沒有使用任何形式的?如果你使用'document = Document.objects.create(...)',你不需要'document.save()'https://docs.djangoproject.com/en/dev/topics/db/queries/#創造對象 – 2011-12-23 23:28:06

回答

1

您是否在<form>標記中設置了enctype="multipart/form-data"?如果request.FILES爲空,則問題不在於您的動態路徑生成(它還沒有到此爲止)。

+0

好,這是愚蠢的。無論如何,作爲一個更廣泛的觀點,是的,我應該只使用表單模型,但是我想在我混淆它之前讓它工作。 – 2011-12-24 02:44:17

0

首先,像@jknupp指出的那樣,別忘了使用enctype="multipart/form-data"。接下來,你可以嘗試創建模型的一種形式:

forms.py

from models import Document 
from django.forms import ModelForm 

class DocumentForm(ModelForm): 

    class Meta: 
     model = Document 

更新您的看法:

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 
    ...