首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django -在视图中设置upload_to

django -在视图中设置upload_to
EN

Stack Overflow用户
提问于 2012-08-03 21:09:34
回答 4查看 3.4K关注 0票数 0

我有一个存储文件的模型:

代码语言:javascript
运行
复制
class AFile(models.Model):
    path = models.CharField(max_length=256)
    name = models.CharField(max_length=256)
    file = models.FileField(upload_to=get_path)

有许多保存文件的视图。我希望每一个都有一个单独的路径。所以我将path放入模型中,并在get path函数中使用它。如下所示:

代码语言:javascript
运行
复制
afile = AFile(path='blah/foo/', name='filex.jpg')
afile.save()

因此,该文件位于正确的位置。但是我并不是真的想在我的数据库中存储路径和名称字段,它只是在那里生成一个路径。有没有办法在不需要额外的模型字段的情况下实现同样的功能?

EN

回答 4

Stack Overflow用户

发布于 2012-08-03 23:11:15

这里的问题是,只有在模型上定义FileFieldImageField时,upload_to才可用。对该字段的任何后续访问都会返回一个FieldFile实例,该实例不能访问已定义的upload_to。长话短说,在最初定义方法之后,没有办法改变它。

但是,您也许能够绕过它进行某种形式的结束。请注意,我还没有真正尝试过这一点,但它应该可以工作:

首先,在模型上定义一个方法,该方法的简单任务是在模型上设置一个实例变量:

代码语言:javascript
运行
复制
def set_upload_to_info(self, path, name):
    self.upload_to_info = (path, name)

然后,在您的upload_to方法中,您可以测试这些属性是否存在,如果它们存在,则使用它们:

代码语言:javascript
运行
复制
def my_upload_to(instance, filename):
    if hasattr(instance, 'upload_to_info'):
        path, name = instance.upload_to_info
        # do something and return file path
    else:
        # standard upload_to bit here

然后在您的视图中,您只需要在保存模型之前调用您创建的方法:

代码语言:javascript
运行
复制
afile.set_upload_to_info(path, name)
afile.save()
票数 3
EN

Stack Overflow用户

发布于 2016-10-13 18:20:52

在保存模型之前,可以通过更改FileFieldfield.upload_to属性在视图中更改upload to参数。在我的例子中,我使用了基于类的视图和表单。所以在模型实例之前。我使用下面的代码来更改上传到路径。

代码语言:javascript
运行
复制
with transaction.atomic():
        model_instance = form.save(commit=False)
        model_instance.creator = self.request.user
        model_instance.img_field.field.upload_to = 'directory/'+model_instance.name+'/logo'
        self.object = form.save()

简而言之,如果您的图像字段命名为imageupload,请相应地更改imageupload.field.upload_to以指向所需的路径。如果这个方法解决了你的问题,请告诉我。

票数 2
EN

Stack Overflow用户

发布于 2012-08-03 21:19:00

为什么不从实例生成路径呢?

代码语言:javascript
运行
复制
def generate_path(instance, filename):
    return os.path.join("hardcoded_prefix", instance.name, filename)

class AFile(models.Model):
    name = models.CharField(max_length=256)
    file = models.FileField(upload_to=generate_path)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11796383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档