我有一个存储文件的模型:
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函数中使用它。如下所示:
afile = AFile(path='blah/foo/', name='filex.jpg')
afile.save()因此,该文件位于正确的位置。但是我并不是真的想在我的数据库中存储路径和名称字段,它只是在那里生成一个路径。有没有办法在不需要额外的模型字段的情况下实现同样的功能?
发布于 2012-08-03 23:11:15
这里的问题是,只有在模型上定义FileField或ImageField时,upload_to才可用。对该字段的任何后续访问都会返回一个FieldFile实例,该实例不能访问已定义的upload_to。长话短说,在最初定义方法之后,没有办法改变它。
但是,您也许能够绕过它进行某种形式的结束。请注意,我还没有真正尝试过这一点,但它应该可以工作:
首先,在模型上定义一个方法,该方法的简单任务是在模型上设置一个实例变量:
def set_upload_to_info(self, path, name):
self.upload_to_info = (path, name)然后,在您的upload_to方法中,您可以测试这些属性是否存在,如果它们存在,则使用它们:
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然后在您的视图中,您只需要在保存模型之前调用您创建的方法:
afile.set_upload_to_info(path, name)
afile.save()发布于 2016-10-13 18:20:52
在保存模型之前,可以通过更改FileField的field.upload_to属性在视图中更改upload to参数。在我的例子中,我使用了基于类的视图和表单。所以在模型实例之前。我使用下面的代码来更改上传到路径。
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以指向所需的路径。如果这个方法解决了你的问题,请告诉我。
发布于 2012-08-03 21:19:00
为什么不从实例生成路径呢?
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)https://stackoverflow.com/questions/11796383
复制相似问题