2010-06-22 9 views
2

Je veux faire appel à une fonction d'auto d'une classe de modèle en tant que tel dans upload_to:Django: Appel de la fonction auto dans un modèle 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" 

Cependant, je reçois NameError: name 'self' is not defined erreur

Répondre

-1

Je pense que cela travailler si vous utilisez une fonction 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

Vous ne pouvez pas utiliser 'self' dans une définition d'attribut. 'undefined name: self' – jnns

-1

dans votre code, l'est une variable Vignettes Fichiers de portée d'une classe large car non défini dans une méthode. donc il n'y a pas de soi disponible dans cette portée.

je pense que vous pouvez utiliser:

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

ou

définissent la valeur au sein d'un constructeur Vignettes Fichiers __init__, où vous pouvez utiliser l'auto !!

+0

Je pense que la dernière solution est la meilleure, définissez tout ce qui n'est pas spécifique à la classe dans le constructeur __init__ –

+0

J'aime la première méthode ici, mais vous devrez définir' gen_save_path' comme une méthode de classe si vous fais ça. –

+2

Vous ne pouvez pas accéder au nom de classe à l'intérieur de la classe, Foo.gen_save_path donnera l'erreur 'Foo' non définie –

3

filestack est un attribut de classe et tout en déclarant vous ne pouvez pas utiliser l'auto car il n'y a pas d'objet de la classe (self) encore créé, en tout cas selon la django docsupload_to prend deux arguments, par exemple (une instance du modèle où la FileField est défini) et le nom (le nom du fichier qui a été initialement donné au fichier), de sorte que vous pouvez définir upload_to à cette fonction

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) 

Si vous souhaitez inclure gen_save_path dans la classe, vous pouvez utiliser un lambda pour appeler self.gen_save_path par exemple

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"