我想动态创建上传文件的目的地。 但是,似乎'upload_to'选项仅适用于模型,而不适用于表单。所以下面的代码是错误的。
类MyForm(forms.Form):
fichier = forms.FileField(**upload_to='files/%m-%Y/'**)
在处理上传文件的视图中,目标是静态的。我怎样才能让它变得动态?
谢谢。
答案 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目录。