【问题标题】:Upload file to Django with dynamic path使用动态路径将文件上传到 Django
【发布时间】:2016-06-08 12:04:25
【问题描述】:

我正在尝试上传文件并组织媒体文件夹中的目录结构。具体来说,我希望上传基于模型中的值之一创建子文件夹。我面临的问题是,在视图中我向实例添加了信息(在我的示例代码中,这是相关的profile)。我想将此信息用于子文件夹,但它在我的模型中不存在,直到上传后的保存...

将信息放入Upload 以便创建子文件夹的适当方法是什么?

谢谢

型号:

class Upload(models.Model):
    file = models.FileField(upload_to="upload/")
    profile = models.ForeignKey(Profile, blank=True, null=True)

    def get_upload_to(self, field_attname):
        return 'upload/%d' % self.profile

查看:

def profile(request, profile_slug):
    profile = Profile.objects.get(slug=profile_slug)
    context_dict['profile'] = profile
    if request.method=="POST":
            for file in request.FILES.getlist('file'):
                    upload = UploadForm(request.POST, request.FILES)
                    if upload.is_valid():
                            newupload = upload.save(commit=False)
                            newupload.profile = profile
                            newupload.save()
    else:
        pass

    upload=UploadForm()
    context_dict['form'] = upload

    return render(request, 'app/profile.html', context_dict)

解决方案,感谢 xyres:

型号:

def get_upload_to(instance, filename):
    return 'upload/%s/%s' % (instance.profile, filename)

class Upload(models.Model):
    file = models.FileField(upload_to=get_upload_to)
    profile = models.ForeignKey(Profile, blank=True, null=True)

查看:

def profile(request, profile_slug):
    profile = Profile.objects.get(slug=profile_slug)
    context_dict['profile'] = profile
    if request.method=="POST":
        upload = UploadForm(request.POST, request.FILES)
        if upload.is_valid():
            for f in request.FILES.getlist('file'):
                Upload.objects.create(file=f, profile=profile)
        return redirect(reverse('profile')
    else:
        pass

    return render(request, 'app/profile.html', context_dict)

【问题讨论】:

    标签: django upload


    【解决方案1】:

    返回上传路径的函数有两个参数,分别是:instancefilename。您需要在此类之外定义此函数并将此函数提供给upload_to 选项。

    这就是你需要重写代码的方式:

    def get_upload_to(instance, filename):
        return 'upload/%d/%s' % (instance.profile, filename)
    
    
    class Upload(models.Model):
        file = models.FileField(upload_to=get_upload_to)
        profile = models.ForeignKey(Profile, blank=True, null=True)
    

    编辑:

    如果您想知道为什么不能在类中定义 get_upload_to,以下是您最有可能遇到的错误:

    ValueError:在categ.models 中找不到函数get_upload_to。

    请注意,由于 Python 2 的限制,您不能序列化未绑定的方法函数(例如,在同一类主体中声明和使用的方法)。请将函数移到主模块主体中以使用迁移。

    【讨论】:

    • 所以还不完美.. 目录结构运行良好,但我只注意到每个上传文件的文件都是相同的。它将根据文件数量保存上传中的第一个文件。似乎“for file in request.FILES.getlist('file'):”只是对第一个文件重复......
    • @marckr 我真的不能说是什么导致了这种行为。但看看this answerthis answer,我认为它应该可以按预期工作。
    • 谢谢,我会为此提出一个新问题。
    猜你喜欢
    • 2012-05-18
    • 2016-03-20
    • 2018-05-02
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多