2011-12-23 236 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 
    ...