Python 类函数对self的未解析引用
为什么我的IDE告诉我行中有一个对self的Python 类函数对self的未解析引用,python,django,Python,Django,为什么我的IDE告诉我行中有一个对self的未解析引用: --> photo = models.ImageField(upload_to=self.upload_path) 代码: 当我将upload\u path函数放在类外时,此错误不会出现。但是,我希望类中的函数尽量保持整洁 没有IDE错误,但我不确定原因 def upload_path(self, filename): title = self.album.title if " " in title:
未解析引用
:
--> photo = models.ImageField(upload_to=self.upload_path)
代码:
当我将upload\u path
函数放在类外时,此错误不会出现。但是,我希望类中的函数尽量保持整洁
没有IDE错误,但我不确定原因
def upload_path(self, filename):
title = self.album.title
if " " in title:
title.replace(" ", "_")
return os.path.join(title, filename)
class Photo(models.Model):
title = models.CharField(max_length=50, blank=True)
album = models.ForeignKey(Album)
photo = models.ImageField(upload_to=upload_path)
upload = models.DateTimeField(auto_now_add=True)
self
只能在将其定义为参数的类方法内部使用
在这种情况下,您需要将该方法视为未绑定的方法(不提供self
的值),因为Django本身将作为第一个参数传入实例:
class Photo(models.Model):
def upload_path(self, filename):
....
photo = models.ImageField(upload_to=upload_path)
请注意,因为您在类定义本身内部使用的是upload\u path
,所以用法必须在upload\u path
的定义之后
编辑:
根据,Django在Python2.x上的迁移系统存在一个限制,这将导致它无法使用上述代码,即使代码本身是正确的。为了使用迁移,您必须将函数放在类之外
国家:
如果您使用的是Python2,我们建议您将upload_to的方法和接受可调用(例如default)的类似参数移动到主模块体中,而不是类体中
因为
self
在方法之外不存在。IDE删除了错误,但我现在得到了这个错误=/:AttributeError:“module”对象没有属性“upload\u path”
我看到这被接受了,你怎么做才能修复这个错误?@Liondancer你不应该在我的答案中用代码得到那个错误。也许你的东西顺序不对。这是带有回溯的代码:也许我应该注意到我想迁移它。有人建议:尝试将其转换为@classmethod。。。参数应该是upload_path(cls、实例、文件名),然后您可以通过编写upload_path=Photo.upload来修复迁移_path@Liondancer显然,这是Django迁移系统的一个限制。虽然上面的代码是正确的Python,但Django的迁移系统会基于它生成更多的代码,这是错误的。在bug报告中,他们说您需要像最初一样将函数放在类之外。
class Photo(models.Model):
def upload_path(self, filename):
....
photo = models.ImageField(upload_to=upload_path)