2010-06-22 68 views
2

我想在upload_to呼吁模型类的自我功能等内部:Django的:调用自身功能的Django模型

class Foo(models.Model): 
    filestack = models.FileField(upload_to=self. gen_save_path) 

    def gen_save_path(self): 
     """ 
     gen_save_path: void -> String 
     Generates the path as a string for fileStack field. 
     """ 
     return "some generated string" 

不过我正在NameError: name 'self' is not defined错误

回答

-1

我认为这将如果使用lambda函数,则工作:

class Foo(models.Model): 
    filestack = models.FileField(upload_to=lambda: self.gen_save_path()) 

    def gen_save_path(self): 
     """ 
     gen_save_path: void -> String 
     Generates the path as a string for fileStack field. 
     """ 
     return "some generated string" 
+0

你不能在属性定义中使用'self'。 'undefined name:self' – jnns 2011-07-03 17:11:57

-1

在您的代码中,filestack是一个类宽范围变量,因为未在方法中定义。 所以在这个范围内没有可用的自我。

我认为你可以使用:

filestack =models.FileField(upload_to=Foo.gen_save_path) 

一个__init__构造,在那里你可以使用自定义范围内的值filestack!

+0

我认为最后一个解决方案是最好的解决方案,在__init__构造函数中定义所有不是类特定的东西 – 2010-06-22 09:17:57

+0

我喜欢这里的第一个方法,但是如果你需要将'gen_save_path'定义为类方法去做。 – 2010-06-22 09:26:00

+2

你不能在类中访问类名,Foo.gen_save_path会给出未定义的错误'Foo' – 2010-06-22 09:34:38

3

filestack是一个类属性,并同时宣布它没有课(self)尚未创建的对象,你不能使用自我,根据反正Django的docsupload_to有两个参数,例如(该模型的实例,其中FileField字段定义)和文件名(最初是考虑到文件)的文件名,所以你可以设置upload_to这样的功能

def gen_save_path(instance, filename): 
    """ 
    gen_save_path: void -> String 
    Generates the path as a string for fileStack field. 
    """ 
    return "some generated string" 

class Foo(models.Model): 

    filestack = models.FileField(upload_to=gen_save_path) 

如果您希望包括gen_save_path类里面,你可以使用lambda调用self.gen_save_path例如

class Foo(models.Model): 

    filestack = models.FileField(upload_to=lambda self, fname:self.gen_save_path(fname)) 

    def gen_save_path(self, filename): 
     return "some generated string"