【问题标题】:Django ImageField passing a callable to upload_toDjango ImageField 将可调用对象传递给 upload_to
【发布时间】:2012-02-23 19:52:03
【问题描述】:

我正在尝试将自定义 upload_to 函数传递给我的模型 imageField 但我想将该函数定义为模型函数....这可能吗?

class MyModel(models.Model):
    ...
    image = models.ImageField(upload_to=self.get_image_path)
    ...

    def get_image_path(self, filename):
        ...
        return image_path

现在我知道我不能通过“self”引用它,因为此时 self 不存在......有没有办法做到这一点?如果不是,那么定义该函数的最佳位置在哪里?

【问题讨论】:

标签: django django-models


【解决方案1】:

您可以使用staticmethod 装饰器在类内部定义upload_to(作为静态方法)。与典型的解决方案相比,它没有真正的好处,典型的解决方案是在类定义之前定义 get_image_path like here)。

class MyModel(models.Model):

    # Need to be defined before the field
    @classmethod       
    def get_image_path(cls, filename): 
        # 'self' will work, because Django is explicitly passing it.
        return filename

    image = models.ImageField(upload_to=get_image_path)

【讨论】:

  • @Secator:我在自己的代码中尝试过,但实际上并没有调用该方法——对于文件位置,我得到“当前:/o7pDX.jpg”
  • @Colleen,它也将我的静态方法转换为字符串。看起来该方法必须是模块(或某些模块)的直接属性。
  • 如果您将get_image_path 定义为没有@classmethod 的普通方法,它会起作用
  • @classmethod 中,第一个参数应该是类而不是对象。为了减少混淆,我认为您应该使用cls 而不是self
【解决方案2】:

所以只需删除“@classmethod”,Secator 的代码就可以工作了。

class MyModel(models.Model):

    # Need to be defined before the field    
    def get_image_path(self, filename): 
        # 'self' will work, because Django is explicitly passing it.
        return filename

    image = models.ImageField(upload_to=get_image_path)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2014-11-08
    • 2018-02-25
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多