Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将文件上载到自定义文件路径_Python_Django_File Upload - Fatal编程技术网

Python 如何将文件上载到自定义文件路径

Python 如何将文件上载到自定义文件路径,python,django,file-upload,Python,Django,File Upload,我正在尝试建立一个系统,在这个系统中,用户上传的文件将根据用户名和文件名给出一个路径。的答案似乎为我指明了正确的方向,但从这个角度来看,我在实现方面遇到了一些问题 我有一个模型使用了这个: class Document(models.Model): user = models.ForeignKey(User) name = models.CharField(max_length=100, blank=False, null=False) date = models.Dat

我正在尝试建立一个系统,在这个系统中,用户上传的文件将根据用户名和文件名给出一个路径。的答案似乎为我指明了正确的方向,但从这个角度来看,我在实现方面遇到了一些问题

我有一个模型使用了这个:

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
自定义文档文件路径的定义如下:

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


本质上,我只是想知道当我通过这个模型添加一个新文档时,我需要做什么来复制管理员的行为。

您的
标签中是否设置了
enctype=“multipart/form data”
?如果
request.FILES
为空,则问题不在于动态路径生成(它还没有达到这个程度)。

首先,正如@jknupp指出的,不要忘记使用
enctype=“multipart/form data”
。接下来,您可以尝试为模型创建表单:

forms.py

更新您的视图:

views.py


不使用任何形式?如果你使用
document=document.objects.create(…)
你不需要
document.save()
那太愚蠢了。总之,作为一个更广泛的观点,是的,我应该只使用表单模型,但我想在我混淆它之前让它工作起来。
from models import Document
from django.forms import ModelForm

class DocumentForm(ModelForm):

    class Meta:
        model = Document
... #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
    ...