在Django中使用上传文件的动态目标文件夹

时间:2009-12-20 18:54:37

标签: django file-upload

我想动态创建上传文件的目的地。 但是,似乎'upload_to'选项仅适用于模型,而不适用于表单。所以下面的代码是错误的。

  

类MyForm(forms.Form):

     fichier = forms.FileField(**upload_to='files/%m-%Y/'**)

在处理上传文件的视图中,目标是静态的。我怎样才能让它变得动态?

谢谢。

2 个答案:

答案 0 :(得分:5)

class YourFileModel(models.Model)
    def upload_path(self, name):
        name = do_sth_with_name(name)
        folder = generate_folder_name(self.id, self.whatever_field)
        return 'uploads/' + folder + '/' + name

    file = models.FileField(upload_to=upload_path)

评论后编辑

def handle_uploaded_file(file):
    # generate dynamic path
    # save file to that path

示例http://docs.djangoproject.com/en/dev/topics/http/file-uploads/#handling-uploaded-files

如果来自model的表单,则覆盖save()方法

class YourForm(forms.ModelForm):
    fichier = forms.FileField()
    def save(self):
        if self.cleaned_data['fichier']:
            file = handle_uploaded_file(self.cleaned_data['fichier'])
        super(YourForm, self).save()

如果不是模型中的表单,请在视图中调用上传处理程序

def your_view(request):
    #####
    if form.is_valid():
        file = handle_uploaded_file(form.cleaned_data['fichier'])

答案 1 :(得分:2)

而不是字符串,提供可调用的 - 即获取模型实例和字符串的函数的名称,并返回所需的名称。有关详细信息,请参阅FileField docs。他们没有说的一件事(至少我在文档中找不到它)是如果返回的文件名以'/'开头,那么它是一个绝对路径,否则它是相对于你的/ media目录。