【问题标题】:How to upload a file to a custom file path如何将文件上传到自定义文件路径
【发布时间】:2023-04-07 06:32:01
【问题描述】:

我正在尝试建立一个系统,在该系统中,用户上传的文件将根据用户名和文件名获得路径。 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 中,但这显示为一个空字典。

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

【问题讨论】:

标签: python django file-upload


【解决方案1】:

您的<form> 标签中是否设置了enctype="multipart/form-data"?如果request.FILES 为空,则问题不在于您的动态路径生成(还没有到那么远)。

【讨论】:

  • 那太愚蠢了。无论如何,作为一个更广泛的观点,是的,我应该只使用表单模型,但我想在我不再混淆它之前让它工作。
【解决方案2】:

首先,就像@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
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2016-10-20
    • 2019-03-17
    • 1970-01-01
    • 2023-04-09
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多