Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类函数对self的未解析引用_Python_Django - Fatal编程技术网

Python 类函数对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:

为什么我的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:
        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)